“Program Analysis for Software Testing”

Fall 2017: Mondays, 4:30pm-7:10pm, Room TBA

Instructor: Prof. Jonathan Bell
Email: [email protected]
Twitter: @_jon_bell_
Office: 4422 Engineering Building; (703) 993-6089
Office Hours: Anytime electronically, Mondays 3:30-4:30pm, or by appointment


Students are required to have previously taken a compilers course (E.g. CS 540) OR a testing class (e.g. SWE 637) OR special permission from the instructor to take this class. This class also assumes working knowledge of programming in Java and C/C++ (although most assignments will use Java). Students must also have working understanding of UNIX shell environments. For CS MS students, this course will count towards the Programming Languages/Software Engineering Requirement.


Learn different methods for analyzing software, with several applications in software engineering, particularly testing. We will study different analysis techniques, learn how they work by studying specific algorithms and tools, and discuss applications of the techniques. Our goal will be to explore the current research issues in this cutting edge area, to learn how to build software analysis tools, and to understand how these techniques can be applied to software development activities.

We will primarily focus on applications for testing software, including automatic test data generation. We will also consider using analysis techniques for other software related activities such as maintenance, reuse, metrics, and optimization. Some of the specific analysis techniques to be studied are parsing, software representation methods (control flow graphs, data flow graphs, program dependency graphs), symbolic evaluation, constraints, program slicing, software coupling, and testability.

While we will consider analyses in various languages (e.g. applying to native x86 binaries, Java and JavaScript), there will be a particular emphasis towards Java and JavaScript analysis.

Intended Audience:

This graduate-level course is intended for students in a MS degree program or in a PhD program. This course is intended for students who would like to become more productive software engineers in industry by applying analysis tools.

This is also intended for research-focused students who would like to prepare for research in programming languages, compilers or software engineering, or would like to prepare for research in other areas of computer science (E.g., security or systems) that involve applying software analysis and testing.

Learning Outcomes:

  • Understand the abstract properties of different techniques for analyzing and testing software.
  • Compute the outcome of these techniques on concrete code examples.
  • Evaluate the suitability of different techniques for a given software and/or set of constraints.
  • Run analysis and testing tools on actual software and interpret their results to improve the quality of their code.

Required Materials:

There is no required textbook for this class. Weekly readings will involve academic papers, which will be made available online. To complete the homeworks and project successfully, students will need access to a computer capable of running virtualization technology (e.g. VirtualBox).


20% Midterm
40% Homework
30% Final Project
5% Participation
5% Labs


Static Analysis and Verification
Control Flow Analysis
Data Flow Analysis
Program Slicing
Delta Debugging
Test Input Generation
Dynamic Symbolic Execution