Understanding basic concepts of software analysis and metrics used to estimate the effectiveness of analysis.
Building an understanding of the LLVM framework: IR, API, and the toolchain.
Building a coverage-guided random input generator a.k.a. “fuzzer” for testing C programs.
Building a delta debugger for minimizing inputs that cause a program to crash — making it easier for the user to understand the bug.
Building a statistical debugger for remote program monitoring and debugging.
Building a “division-by-zero” static analysis for a subset of the C language that includes branches and loops.
Writing a “division-by-zero” static analysis for C programs as an LLVM pass that handles pointer aliasing and dynamically allocated memory.
Writing a constraint-based static analysis for C programs with LLVM and Datalog.
Building a dynamic symbolic executor for C programs with LLVM and Z3.