Reference. A Framework for Debugging Automated Program Verification Proofs via Proof Actions
Many program verification tools provide automation via SMT solvers, allowing them to automatically discharge many proofs. However, when a proof fails, it can be hard to understand why it failed or how to fix it. The main feedback the developer receives is simply the verification result (i.e., success or failure), with no visibility into the solver’s internal state. To assist developers using such tools, we introduce ProofPlumber, a novel and extensible proof-action framework for understanding and debugging proof failures. Proof actions act on the developer’s source-level proofs (e.g., assertions and lemmas) to determine why they failed and potentially suggest remedies. We evaluate ProofPlumber by writing a collection of proof actions that capture common proof debugging practices. We produce 17 proof actions, each only 29–177 lines of code.
Cite
Cites 40 works (1 here)
With notes (1)
Verus: Verifying Rust Programs using Linear Ghost Types lattuada-2023-verus
The Rust programming language provides a powerful type system that checks linearity and borrowing, allowing code to safely manipulate memory without garbage collection and making Rust ideal for developing low-level, high-assurance systems. For such systems, formal verification can be useful to prove functional correctness properties beyond type safety. This paper presents Verus, an SMT-based tool for formally verifying Rust programs. With Verus, programmers express proofs and specifications using the Rust language, allowing proofs to take advantage of Rust’s linear types and borrow checking. We show how this allows proofs to manipulate linearly typed permissions that let Rust code safely manipulate memory, pointers, and concurrent resources. Verus organizes proofs and specifications using a novel mode system that distinguishes specifications, which are not checked for linearity and borrowing, from executable code and proofs, which are checked for linearity and borrowing. We formalize Verus’ linearity, borrowing, and modes in a small lambda calculus, for which we prove type safety and termination of specifications and proofs. We demonstrate Verus on a series of examples, including pointer-manipulating code (an xor-based doubly linked list), code with interior mutability, and concurrent code.
External (39)
- Bitwuzla (2023)
- Mariposa: Measuring SMT Instability in Automated Program Verification (2023)
- cvc5: A Versatile and Industrial-Strength SMT Solver (2022)
- Better Counterexamples for Dafny (2022)
- Certified Programming with Dependent Types (2022)
- The Lean 4 Theorem Prover and Programming Language (2021)
- Gobra: Modular Specification and Verification of Go Programs (2021)
- Leveraging rust types for modular specification and verification (2019)
- Lightweight multi-language syntax transformation with parser parser combinators (2019)
- Meta-F $$^\star $$ : Proof Automation with SMT, Tactics, and Metaprograms (2019)
- Nagini: A Static Verifier for Python (2018)
- Btor2, BtorMC and Boolector 3.0 (2018)
- The Rust Programming Language (Klabnik and Nichols) (2018)
- Dependent types and multi-monadic effects in F* (2016)
- Tactics for the Dafny Program Verifier (2016)
- Integrated Environment for Diagnosing Verification Errors (2016)
- The Satisfiability Modulo Theories Library (SMT-LIB) (2016)
- Viper: A Verification Infrastructure for Permission-Based Reasoning (2015)
- Exploration, Analysis, and Manipulation of Source Code Using srcML (2015)
- Yices 2.2 (2014)
- The rust language (2014)
- Extending Sledgehammer with SMT Solvers (2011)
- The Boogie Verification Debugger (Tool Paper) (2011)
- Dafny: An Automatic Program Verifier for Functional Correctness (2010)
- VCC: Contract-based modular verification of concurrent C (2009)
- RASCAL: A Domain Specific Language for Source Code Analysis and Manipulation (2009)
- Z3: An Efficient SMT Solver (2008)
- Translating Higher-Order Clauses to First-Order Clauses (2007)
- Source-Level Proof Reconstruction for Interactive Theorem Proving (2007)
- Beyond Assertions: Advanced Specification and Verification with JML and ESC/Java2 (2006)
- The Spec# Programming System: An Overview (2005)
- A Tactic Language for the System Coq (2000)
- A Discipline of Programming (1976)
- The Coq Proof Assistant (website)
- Verification Debugging When Verification Fails (Dafny reference manual)
- Sliding Admit Verification Style (F* wiki)
- StackOverflow Question: With Dafny, Verify Function to Count Integer Set Elements less than a Threshold
- StackOverflow Question: Hint on FStar Proof Dead End
- Language Server Protocol Specification 3.17