Ajax is a system for the semantic analysis of Java bytecode programs. Ajax is a vehicle for investigating some of the questions in the design of realistic whole program static analyses and their applications:
Information provided by static analysis can be used to assist in many different software engineering tasks. To build specialized tools to address different tasks, we want to easily and cheaply reuse analysis engines. This requires an interface between analyses that produce information and tools that consume it. What should this interface look like?
All known static analyses suffer from a lack of robustness. I define robustness to mean that sensible, meaning-preserving changes to the analyzed code should not severly disrupt the performance and/or precision of the analysis. For example, a context-insensitive analysis is not robust, because it is disrupted when multiple versions of the same code are merged into a single procedure. Similarly, many analyses suffer when variables are moved from the "top level" into data structures. Improving the robustness of analyses while retaining and improving scalability is an important and extremely difficult problem. Ajax makes some advances in improving robustness.
Part of the challenge of robustness is that programming languages and idioms continue to evolve, and in many cases static analyses lag behind. Ajax attempts to address the full Java langauge and thus tackles problems which may be glossed over by other systems. Language features such as dynamic loading, reflection and foreign-language interfaces are becoming more and more the rule, and an honest evaluation of the strengths and weaknesses of static analyses in this realm is urgently needed. There are also very interesting engineering considerations arising from addressing a large and widely-used language.
We suspect that one way to make software engineering tools easier to use and improve ROI is to build tools that are specialized to particular tasks. The Ajax infrastructure is designed to support such tools. So, what kind of tools can we build? How do we design tools to require a minimal amount of user interaction to get the job done? How well do the tools address the needs of programmers?
Ajax is written in Java and includes the following components:
We have used Ajax to analyze real programs of significant size, such as Sun's Java compiler. Ajax analyzes all the library code used by a program as well as the program itself; in the case of javac, this means a total of more than 2,200 methods.
The best source of information is my thesis. Everything's there.
I have a technical report describing the "value-point relation" API that allows various tools to plug into multiple underlying analysis engines.
I have another technical report describing details of some of the optimizations used in the SEMI constraint solver.
The thesis updates and revises these reports and presents the results in a much nicer way. Read it instead.