Programmers usually modify a program intending to fix a bug or to add a new feature. While they often have a strong understanding of the actual changes they are making to a program, the dynamic effects of these changes on the run-time behavior of the program can be harder to comprehend. The approach helps developers identify when their changes to the source code and the changes in the consequent executable behavior are inconsistent: that is, the change in the source is not apparent in the behavior, or vice versa.
The approach identifies specific program elements and dependencies that likely account for the inconsistent nature of the change. Using a static and a dynamic dependence graph from each of two program versions, the dependences are partitioned according to their presence or absence in each of the four graphs. Particular partitions contain dependencies that are likely to represent inconsistent parts of a change; these partitions provide insight into the change that would be otherwise difficult to obtain. The partitions allow distinctions to be made that cannot be made using the static dependence graphs alone, the dynamic dependence graphs alone, nor using a static and dynamic graph pair from a given version; much of the power of the approach arises because the cross-version variations in the dependence graphs are small, reducing information provided to the programmer. The intellectual merit includes empirical assessment over a broad set of programs and changes, ?value propositions? for using this information, applications of the approach, and use of the partitioning to augment conventional approaches to assessing software complexity.
The project addresses two categories of broader impacts: the people directly involved in the research, and the potential for the research to positively affect society through increased programmer productivity.