Lab 1: Introduction to Software Analysis

Understanding basic concepts of software analysis and metrics used to estimate the effectiveness of analysis.

Lab 2: The LLVM Framework

Building an understanding of the LLVM framework: IR, API, and the toolchain.

Lab 3: Random Input Generation

Building a coverage-guided random input generator a.k.a. “fuzzer” for testing C programs.

Lab 4: Delta Debugging

Building a delta debugger for minimizing inputs that cause a program to crash — making it easier for the user to understand the bug.

Lab 5: Statistical Debugging

Building a statistical debugger for remote program monitoring and debugging.

Lab 6: Dataflow Analysis

Building a “division-by-zero” static analysis for a subset of the C language that includes branches and loops.

Lab 7: Pointer Analysis

Writing a “division-by-zero” static analysis for C programs as an LLVM pass that handles pointer aliasing and dynamically allocated memory.

Lab 8: Constraint-Based Analysis

Writing a constraint-based static analysis for C programs with LLVM and Datalog.

Lab 9: Dynamic Symbolic Execution

Building a dynamic symbolic executor for C programs with LLVM and Z3.