Software Analysis and Testing
Course OverviewAspects of software development besides programming, such as diagnosing bugs, testing, and debugging, comprise over 50% of the cost of software development. Modern technology can help automate these aspects and thereby improve programmer productivity and software reliability. At the heart of this technology lies software analysis: a body of work that encompasses techniques for automatically discovering facts about a given program. Many diverse such techniques exist with their own strengths and limitations. This course teaches the principles underlying these techniques as well as imparts hands-on experience with applying them to automate testing, debugging, and finding bugs in complex real-world programs.
Intended AudienceThis is a graduate-level course intended for students who wish to:
- prepare for research in the areas of programming languages, compilers, or software engineering;
- conduct research in other areas of computer science (e.g., security or systems) that involve applying software analysis; and
- become more productive software engineers in industry.
Learning ObjectivesUpon successfully completing the course, you will be able to:
- Describe the abstract properties of different techniques for analyzing and testing software.
- Compute the outcome of the techniques on concrete 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.
Pre-RequisitesThe lectures require basic knowledge of discrete mathematics (e.g., set theory, logic, and probability).
The assignments presume experience with the following:
- Programming in Java, C/C++, or equivalent (most assignments will use Java).
- Using virtual machines (e.g., VirtualBox or VMWare).
- Writing and running shell scripts.
LessonsThe lectures consist of 11 lessons delivered in two forms: videos (streaming from YouTube) and slides (in PDF and PPTX formats).
|L1||Introduction to Software Analysis||[video]||19:36||[PDF]||[PPTX]|
|L2||Introduction to Software Testing||[video]||33:17||[PDF]||[PPTX]|
|L4||Automated Test Generation||[video]||45:52||[PDF]||[PPTX]|
|L11||Dynamic Symbolic Execution||[video]||46:47||[PDF]||[PPTX]|
AssignmentsThere are 8 assignments to complement the lectures and impart hands-on experience. Each assignment is of one of the following two kinds:
- Using a software analysis tool based on a technique covered in lectures, reporting your findings, and answering conceptual questions.
- Implementing a software analysis algorithm in a high-level programming language (usually Java).
|A1||Dafny||L1 (Intro to Software Analysis)|
|A2||Monkey||L3 (Random Testing)|
|A3||Korat||L4 (Automated Test Generation)|
|A4||Randoop||L4 (Automated Test Generation)|
|A5||Dataflow||L5 (Dataflow Analysis)|
|A6||Constraints||L7 (Constraint-Based Analysis)|
|A7||CBI||L9 (Statistical Debugging)|
|A8||Delta||L10 (Delta Debugging)|