Testing and debugging are vital but notoriously difficult parts of the software-development process. Languages like C and C++, with weak type systems, exacerbate the problem by making it easy for programmers to introduce memory- and type-safety bugs. These bugs are hard to identify because the actual error and the symptom often seem to have no logical connection.
This research focuses on designing, implementing, and evaluating innovative new ways to identify, reproduce, and eliminate bugs. Questions addressed include: How to determine whether a program failure is due to a memory/type-safety bug, and in that case how to locate the buggy code (not just the code where the symptom occurs); given a failure that is not due to a memory/type-safety bug, how to reproduce that failure, and how to find the source of the problem.
One of the most creative aspects of the work is the combination of complementary techniques to achieve powerful synergies: dynamic memory type inference is combined with static program slicing to attack memory/type-safety bugs, while program slicing is paired with statistical bug identification to implement new algorithms for finding, reproducing, and repairing other kinds of bugs.