Software development activities other than programming, such as testing, debugging, and conducting security assessments constitute over 50% of the development cost of a modern application. The modern software developer has a wide variety of tools and techniques at their disposal to aid them with these aspects of development.

Software analysis lies at the core of these tools and techniques. Software analysis is a body of work that concerns discovering formal facts about a given program. Many diverse software analysis approaches exist, each with their own strengths, weaknesses, and applications to testing, debugging, performance, and cyber security.

In this course, you will master the underlying principles of software analysis and these approaches, and gain hands-on experience applying them to automate testing software and finding bugs in complex, real-world programs. You will explore techniques including dataflow analysis, constraint-based analysis, type systems, automated test case generation, symbolic execution, and more.

In general, this course introduces software analysis and testing topics in the order in which they can be integrated into a software development lifecycle.

The lessons focus on advanced techniques that go far beyond established practices like manual code reviews, unit testing, and integration testing to find bugs (and security vulnerabilities!) in software.

Most lessons are complemented by a short term assignment that leverages an existing tool or library to reinforce the concepts learned in the lesson. It is useful to think of the assignments as “science labs” - they are meant to bridge the gap between theory and practice as well as deepen your understanding of the material.

In this course, you will use a variety of tools implemented in different programming languages to generate useful facts about a program’s behavior and analyze them. This means you should be comfortable reading and writing basic code in several commonly used languages, such as C, Java and Python. In preparation for taking this course, we recommend that you visit our Readiness Assessment to determine which skills you may wish to refresh or acquire prior to the start of classes.