  Due to the difficulty of repairing defect, many research efforts have been
devoted into automatic defect repair. Given a buggy program that fails some
test cases, a typical automatic repair technique tries to modify the program to
make all tests pass. However, since the test suites in real world projects are
usually insufficient, aiming at passing the test suites often leads to
incorrect patches.
  In this paper we aim to produce precise patches, that is, any patch we
produce has a relatively high probability to be correct. More concretely, we
focus on condition synthesis, which was shown to be able to repair more than
half of the defects in existing approaches. Our key insight is threefold.
First, it is important to know what variables in a local context should be used
in an "if" condition, and we propose a sorting method based on the dependency
relations between variables. Second, we observe that the API document can be
used to guide the repair process, and propose document analysis technique to
further filter the variables. Third, it is important to know what predicates
should be performed on the set of variables, and we propose to mine a set of
frequently used predicates in similar contexts from existing projects.
  We develop a novel program repair system, ACS, that could generate precise
conditions at faulty locations. Furthermore, given the generated conditions are
very precise, we can perform a repair operation that is previously deemed to be
too overfitting: directly returning the test oracle to repair the defect. Using
our approach, we successfully repaired 17 defects on four projects of
Defects4J, which is the largest number of fully automatically repaired defects
reported on the dataset so far. More importantly, the precision of our approach
in the evaluation is 73.9%, which is significantly higher than previous
approaches, which are usually less than 40%.
