My projects tackle problems of knowing what programs will do. These are challenging problems (uncomputable, in fact!). On top of that, we also want to know HOW MANY ways a program can do its thing.

Counting the ways that a program can do something requires analyzing the source code (this is called static analysis), analyzing the running program (this is called dynamic analysis) and performing combinatorial computations (via logic and a field called "model counting"). Doing so allows us to answer questions like "how safe is my code?", "how many test inputs do I need in order to discover some interesting program behavior?", "how complicated is my code?", or “how can an autonomous agent optimize its interaction with my code?”.

### Relevant background: papers and videos

- Paper: Automatically Solving Search Problems Using Program Analysis
- Paper: Automatically Solving Games Using Program Analysis
- Paper: Computing Program Path Complexity (2015)
- Paper: Computing Program Path Complexity (2021)
- Video: Computing Program Path Complexity
- Paper: Synthesizing Exploits (2018)
- Paper: Synthesizing Exploits (2017)
- Paper: Model Counting for Arrays
- Video: Model Counting for Arrays

**Application information: **In your application, please describe your interest or background in the intersection of mathematics (combinatorics / algebra) and programming languages.

Learn and practice math and programming analysis with other people who also enjoy these topics.