Selected Papers by Hira Agrawal
- Efficient Coverage Testing Using Global Dominator Graphs
- Authors:
- H. Agrawal
- Published:
- Proceedings of the ACM SIGPLAN-SIGSOFT Workshop on Program Analysis for Software Tools and Engineering (PASTE'99),
Toulouse, France, September 1999, pp. 11-20; also in SIGSOFT Software Engineering Notes, vol. 24, no. 5, September 1999, pp. 11-20.
- Abstract:
Coverage testing techniques, such as statement and decision
coverage, play a significant role in improving the
quality of software systems. Constructing a thorough
set of tests that yield high coverage, however, is often
a very tedious, time consuming task. In this paper we
present a technique to find a small subset of a program's
statements and decisions with the property that cov-
ering the subset implies covering the rest. We intro-
duce the notion of a mega block which is a set of basic
blocks spanning multiple procedures with the property
that one basic block in it is executed iff every basic
block in it is executed. We also present an algorithm
to construct a data structure called the global domina-
tor graph showing dominator relationships among mega
blocks. A tester only needs to create test cases that are
aimed at executing one basic block from each of the leaf
nodes in this directed acyclic graph. Every other basic
block in the program will automatically be covered by
the same test set.
- Mining System Tests to Aid Software Maintenance
- Authors:
- H. Agrawal, J. L. Alberi, S. Ghosh, J. R. Horgan, J. J. Li, S. London, N. Wilde,
and W. E. Wong
- Published:
- IEEE Computer, vol. 31, no. 7, July 1998, pp. 64-73.
- Abstract:
Maintainers can use information from test analysis tools to help them
understand, debug, and retest programs. The authors describe techniques
and tools in the xS u d s package, a system for understanding and diagnosing
s o f t w a re bugs - including Y2K problems in legacy applications.
- A Study of Effective Regression Testing in Practice
- Authors:
- H. Agrawal, J. R. Horgan, S. London, and W. E. Wong
- Published:
- Proceedings of the Eighth
IEEE International Symposium on Software Reliability Engineering (ISSRE'97),
Albuquerque, New Mexico, November 1997, pp. 264-274.
- Abstract:
The purpose of regression testing is to ensure that
changes made to software, such as adding new features
or modifying existing features, have not adversely affected
features of the software that should not change. Regres-sion
testing is usually performed by running some, or all,
of the test cases created to test modifications in previous
versions of the software. Many techniques have been re-ported
on how to select regression tests so that the num-ber
of test cases does not grow too large as the software
evolves. Our proposed hybrid technique combines modifi-cation,
minimization and prioritization-based selection us-ing
a list of source code changes and the execution traces
from test cases run on previous versions. This technique
seeks to identify a representative subset of all test cases that
may result in different output behavior on the new software
version. We report our experience with a tool called ATAC
which implements this technique.
- Fault Localization Using Execution Slices and Dataflow Tests
- Authors:
- H. Agrawal, J. R. Horgan, S. London, and W. E. Wong
- Published:
- Proceedings of
the Sixth International Symposium on Software Reliability Engineering
(ISSRE'95), Toulouse, France, October 1995, pp. 143-151.
- Abstract:
Finding a fault in a program is a complex process
which involves understanding the program's purpose,
structure, semantics, and the relevant characteristics
of failure producing tests. We describe atool which
supports execution slicing and dicing based on test
cases. We report the results of an experiment that
uses heuristic techniques in fault localization.
- Dominators, Super Blocks, and Program Coverage
- Authors:
- H. Agrawal
- Published:
- The Conference Record of the 21st Annual ACM Symposium on Principles
of Programming Languages (POPL'94), Portland, Oregon, January 1994,
pp. 25-34.
- Abstract:
In this paper we present techniques to find subsets of
nodes of a owgraph that satisfy the following property:
A test set that exercises all nodes in a subset exercises
all nodes in the owgraph. Analogous techniques to find
subsets of edges are also proposed. These techniques
may be used to significantly reduce the cost of coverage
testing of programs. A notion of a super block consisting
of one or more basic blocks is developed. If any basic
block in a super block is exercised by an input then all
basic blocks in that super block must be exercised by
the same input. Dominator relationships among super
blocks are used to identify a subset of the super blocks
whose coverage implies that of all super blocks and, in
turn, that of all basic blocks. Experiments with eight
systems in the range of 1-75K lines of code show that,
on the average, test cases targeted to cover just 29% of
the basic blocks and 32% of the branches ensure 100%
block and branch coverage, respectively.
- On Slicing Programs with Jump Statements
- Authors:
- H. Agrawal
- Published:
- Proceedings of the ACM SIGPLAN'94 Conference on Programming Language Design and
Implementation, Orlando, Florida, June 1994, pp. 302-312.
- Abstract:
Program slices have potential uses in many software en-
gineering applications. Traditional slicing algorithms,
however, do not work correctly on programs that con-
tain explicit jump statements. Two similar algorithms
were proposed recently to alleviate this problem. Both
require the owgraph and the program dependence
graph of the program to be modified. In this paper,
we propose an alternative algorithm that leaves these
graphs intact and uses a separate graph to store the
additional required information. We also show that
this algorithm permits an extremely efficient, conser-
vative adaptation for use with programs that contain
only "structured" jump statements.
- Incremental Regression Testing
- Authors:
- H. Agrawal, J. R. Horgan, E. W. Krauser, and S. L. London
- Published:
- Proceedings of the IEEE Conference on Software Maintenance, Montreal, Canada, September 1993, pp. 348-357.
- Abstract:
The purpose of regression testing is to ensure that
bug fixes and new functionality introduced in a new
version of a software do not adversely affect the cor-
rect functionality inherited from the previous version.
This paper explores efficient methods of selecting small
subsets of regression test sets that may be used to es-
tablish the same.
- Debugging with Dynamic Slicing and Backtracking
- Authors:
- H. Agrawal, R. A. DeMillo and E. H. Spafford
- Published:
- Software--Practice & Experience, vol. 23, no. 6, June 1993, pp. 589-616.
- Abstract:
Programmers spend considerable time debugging code. Symbolic debuggers provide
some help but the task remains complex and difficult. Other than breakpoints and trac-
ing, these tools provide little high-level help. Programmers must perform many tasks
manually that the tools could perform automatically, such as finding which statements
in the program affect the value of an output variable for a given testcase, and what was
the value of a given variable when the control last reached a given program location. If
debugging tools provided explicit support for these tasks, the debugging process could
be automated to a significant extent.
In this paper we present a debugging paradigm, based on dynamic program slicing
and execution backtracking techniques, that easily lends itself to automation. This
paradigm is based on experience with using these techniques to debug software. We
also present a prototype debugging tool, Spyder , that explicitly supports the proposed
paradigm, and with which we are performing further debugging research.
- An Execution Backtracking Approach to Program Debugging
- Authors:
- H. Agrawal, R. A. DeMillo and E. H. Spafford
- Published:
- IEEE Software, May 1991, pp. 21-26.
- Abstract:
An execution backtracking facility ininteractive source debuggers allows users to mirror
their thought processes while debugging -- working backwards from the location where an error
is manifested and determining the conditions under which the error occurred. Such a facility
also allows a user to change program characteristics and reexecute from arbitrary points within
the program under examination -- a "what-if" capability.
This paper describes an experimental debugger that provides such a backtracking function.
We describe why the facility is useful, and why other current techniques are inadequate. We
show how execution backtracking can be efficiently implemented by saving only the latest values
of variables modified by a statement, and allowing backtracking only over complete program
statements. We also describe how this approach relates to our work on dynamic program
slicing.
- Dynamic Slicing in Presence of Unconstrained Pointers
- Authors:
- H. Agrawal, R. A. DeMillo and E. H. Spafford
- Published:
- Proceedings of the ACM SIGSOFT'91
Symposium on Software Testing, Analysis, and Verification (TAV4), Victoria,
British Columbia, Canada, October 1991, pp. 60-73.
- Abstract:
Program slices are useful in debugging. Most work
on program slicing to date has concentrated on finding slices of programs involving only scalar variables.
Pointers and composite variables do not lend them-
selves well to static analysis, especially when the lan-
guage involved is not strongly-typed. When debug-
ging a program, however, we are interested in analyz-
ing the program behavior for testcases that reveal a
fault. In this paper, we present a uniform approach
to handling pointers and composite variables such as
arrays, records, and unions for the purpose of obtain-
ing dynamic program slices. The dynamic approach
proposed works well even when the language involved
allows unconstrained pointers and performs no run-
time checks, as in C.
- Dynamic Program Slicing
- Authors:
- H. Agrawal, J. R. Horgan
- Published:
- Proceedings of the ACM SIGPLAN'90 Conference on Programming Language Design and
Implementation, White Plains, New York, June 1990, pp. 246-256, also
in SIGPLAN Notices, vol. 25, no. 6, June 1990, pp. 246-256.
- Abstract:
The conventional notion of a program slice -- the set
of all statements that might affect the value of a variable occurrence -- is totally independent of the program input values. Program debugging, however, involves analyzing the program behavior under the specific inputs that revealed the bug. In this paper we
address the dynamic counterpart of the static slicing
problem -- finding all statements that really affected
the value of a variable occurrence for the given program inputs. Several approaches for computing dy-
namic slices are examined. The notion of a Dynamic
Dependence Graph and its use in computing dynamic
slices is discussed. We introduce the concept of a Reduced Dynamic Dependence Graph whose size does
not depend on the length of execution history, which
is unbounded in general, but whose size is bounded
and is proportional to the number of dynamic slices
arising during the program execution.
|