computations to satisfy the target predicate. This
limitation was partially addressed in the work of
McMinn and Holcombe (2006) and has been
strengthened by STIG to be able to intertwine with
dynamic symbolic execution.
Complexity. The cost of applying the chaining
mechanism comes from two facets. One is
performing data flow analysis to identify definition
statements (or formally reaching definitions) (Aho et
al., 2008) of problem nodes. This is a maximum
fixedpoint algorithm operated statically on the
source code of the program prior to dynamic
symbolic execution. The algorithm complexity is the
product of the height of the lattice and the number of
nodes in the program flow graph, which is minor
compared to the very expensive cost of performing
dynamic symbolic execution. The other is the cost of
performing dynamic symbolic execution with the
guidance of event sequences. This cost results
actually in the number of runs that S
TIG requires to
execute the program, which was confirmed
significantly smaller than other search strategies and
tools. In fact, we observed from the experiments that
C
REST and STIG both executed the test subjects
within a matter of a few seconds. Pex and Fitnex,
however, consumed a considerable amount of time
on all the test subjects.
Evaluation. The evaluation was conducted in a
small set of test subjects. However, these test
subjects reveal characteristic exploration problems
of real world programs for which dynamic symbolic
execution without guidance is ineffective to apply.
Future work aims to extend the proposed approach
and conduct experiments on large test subjects to
properly assess the validity of our proposal and
observations. We believe that when testing sizeable
and complex programs, where the path space is too
large to systematically exhaustively explore, the
ability to break down the path space and to precisely
guide the search process by centralizing on selected
aspects of semantics of our proposed approach is
essential in optimizing the very expensive cost of
performing dynamic symbolic execution to
maximize coverage achievements and enhance error-
detection capabilities.
7 CONCLUSIONS
Achieving high code coverage is an important goal
of software testing. Dynamic symbolic execution
based techniques hold most promise to make this
goal achievable. When applied to real world
software, the scalability of dynamic symbolic
execution, however, is limited due to the extremely
large program path space. In this paper, we have
proposed to apply data flow analysis to effectively
and efficiently perform dynamic symbolic execution
for maximum code coverage. The proposed
approach alleviates the combinatorial path space
explosion by guiding the search process to focus on
code segments that truly affect the execution of
uncovered code. The experimental evaluation shows
that S
TIG is effective in maximizing code coverage,
optimizing path explorations, and providing useful
evidence to identify infeasible code elements. In
most of the experiments, S
TIG achieves higher
coverage with significantly small path explorations
than popular state-of-the-art test case generation
tools.
ACKNOWLEDGEMENTS
We thank Kiran Lakhotia for sending us source code
of test subjects used in his work (Binkley et al.,
2011). We are grateful to Nikolai Tillmann and Tao
Xie for their help on Pex and Fitnex.
REFERENCES
Aho, A. V., Lam, M. S., Sethi, R., and Ullman, J. D.
(2008). Compilers: Principles, Techniques, and Tools.
Addison Wesley, 2
nd
edition.
Binkley, D. W., Harman, M., and Lakhotia, K. (2011).
FlagRemover: A testability transformation for
transforming loop-assigned flags. ACM Transactions
on Software Engineering and Methodology 20(3).
Bird, D., and Munoz, C. (1983). Automatic generation of
random self-checking test cases. IBM Systems Journal,
22(3), 229-245.
British Standards Institute (1998). BS 7925-1 Vocabulary
of Terms in Software Testing.
Burnim, J., and Sen, K. (2008). Heuristics for scalable
dynamic test generation. In ASE, pp. 443-446.
Cadar, C., Godefroid, P., Khurshid, S., Păsăreanu, C. S.,
Sen, K., Tillmann, N., and Visser, W. (2011).
Symbolic execution for software testing in practice:
preliminary assessment. In ICSE, pp. 1066-1071.
Ferguson, R., and Korel, B. (1996). The chaining approach
for software test data generation. ACM Transactions
on Software Engineering and Methodology, 5(1).
Godefroid, P., Klarlund, N., and Sen, K. (2005). DART:
directed automated random testing. In PLDI '05, pp.
213-223.
King, J. C. (1976). Symbolic execution and program
testing. Communications of the ACM, 19, 385 - 394.
McMinn, P. (2004). Search-based software test data
generation: a survey. Software Testing, Verification
and Reliability, 14(2).
PreciseGuidancetoDynamicTestGeneration
11