Software is becoming ever more complex and difficult to understand, at the same time as it is used ever more pervasively. It is hopeless to understand how software systems work (or why they do not work!) without automated assistance. Programmers need tool assistance during design, implementation, testing, debugging, and modification ("maintenance"). This graduate seminar will investigate a variety of program analysis techniques that address these software engineering tasks.
Static analysis topics include abstract interpretation (dataflow), type systems (including inference and non-standard type systems), model checking, decision procedures (SAT, BDDs, etc.), theorem-proving. Dynamic analysis topics include testing, fault isolation (debugging), model inference, and visualization. While the course focuses on the design and implementation of program analysis tools, the material will be useful to anyone who wishes to improve his or her programming or understand the state of the art.
Students will read classic and current technical papers, lead one in-class discussion, and actively participate in other discussions. The heart of the class is a team research project. Sample projects will be provided, but students are also free to propose their own, particularly ones motivated by their own problems experienced while programming. Examples include proposing and evaluating a fundamental new technique; developing and assessing new algorithms to replace currently-used ones; translating a methodology to a new problem domain; evaluation of proposed techniques (for instance, via a user study); and applying known techniques to new problem domains, such as operating systems, networks, embedded systems, security, biology, aerospace, etc.
This is not a class about how to build programs, though the information in the class may help you to do that. Rather, this is a class about research in software engineering.
Prerequisites: none. Motivated undergraduates and Master's students are welcome.