The last decade has seen an explosion in techniques for automated program analysis. Modern program analysis techniques are widely applicable and have thus enabled a vast range of interesting applications: from ensuring correctness of complex algorithms to finding security violations in mobile applications, to reasoning about biological DNA systems, and even to code synthesis.

This course will cover the core principles behind these automated techniques including static and dynamic program analysis, symbolic execution, predicate abstraction, pointer analysis as well as practical analysis frameworks such as Soot and Wala.

To gain a deeper understanding of how to apply these techniques in practice, the course will involve a small hands-on programming project where based on the principles introduced in class, the students will build a program analyzer for a modern programming language.