  Once a failure is observed, the primary concern of the developer is to
identify what caused it in order to repair the code that induced the incorrect
behavior. Until a permanent repair is afforded, code repair patches are
invaluable. The aim of this work is to devise an automated patch generation
technique that proceeds as follows: Step1) It identifies a set of
failure-causing control dependence chains that are minimal in terms of number
and length. Step2) It identifies a set of predicates within the chains along
with associated execution instances, such that negating the predicates at the
given instances would exhibit correct behavior. Step3) For each candidate
predicate, it creates a classifier that dictates when the predicate should be
negated to yield correct program behavior. Step4) Prior to each candidate
predicate, the faulty program is injected with a call to its corresponding
classifier passing it the program state and getting a return value predictively
indicating whether to negate the predicate or not. The role of the classifiers
is to ensure that: 1) the predicates are not negated during passing runs; and
2) the predicates are negated at the appropriate instances within failing runs.
We implemented our patch generation approach for the Java platform and
evaluated our toolset using 148 defects from the Introclass and Siemens
benchmarks. The toolset identified 56 full patches and another 46 partial
patches, and the classification accuracy averaged 84%.
