Reference. Cazamariposas: Automated Instability Debugging in SMT-Based Program Verification
Program verification languages such as Dafny and F often rely heavily on Satisfiability Modulo Theories (SMT) solvers for proof automation. However, SMT-based verification suffers from instability, where semantically irrelevant changes in the source program can cause spurious proof failures. While existing mitigation techniques emphasize preemptive measures, we propose a complementary approach that focuses on diagnosing and repairing specific instances of instability-induced failures. Our key technique is a novel differential analysis to pinpoint problematic quantified formulas in an unstable query. We implement this technique in Cazamariposas, a tool that automatically identifies such quantified formulas and suggests fixes. We evaluate Cazamariposas on multiple large-scale systems verification projects written in three different program verification languages. Our results demonstrate Cazamariposas’ effectiveness as an instability debugger. In the majority of cases, Cazamariposas successfully isolates the issue to a single problematic quantifier, while providing a stabilizing fix.
Cite
Cites 34 works (4 here)
With notes (4)
Formally Verified Cloud-Scale Authorization chakarov-2025-formally
Verus: A Practical Foundation for Systems Verification lattuada-2024-verus
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.
IronFleet: proving practical distributed systems correct hawblitzel-2015-ironfleet
External (30)
- Cazamariposas (software repository) (2025)
- Cazamariposas: Automated Instability Debugging in SMT-based Program Verification (Technical Report) (2025)
- Free Facts: An Alternative to Inefficient Axioms in Dafny (2024)
- Cedar: A New Language for Expressive, Fast, Safe, and Analyzable Authorization (2024)
- StarMalloc: Verifying a Modern, Hardened Memory Allocator (2024)
- Using normalization to improve SMT solver stability (arXiv: Towards SMT Solver Stability via Input Normalization) (2024)
- Context pruning for more robust SMT-based program verification (2024)
- Avoiding verification brittleness in Dafny (blog) (2023)
- Mariposa: Measuring SMT instability in automated program verification (2023)
- cvc5: A Versatile and Industrial-Strength SMT Solver (2022)
- Formally Verifying Industry Cryptography (2022)
- A Billion SMT Queries a Day (Invited Paper) (2022)
- EverCrypt: A Fast, Verified, Cross-Platform Cryptographic Provider (2020)
- The Axiom Profiler: Understanding and Debugging SMT Quantifier Instantiations (2019)
- Faster, Higher, Stronger: E 2.3 (2019)
- Semantic-based Automated Reasoning for AWS Access Policies using SMT (2018)
- Komodo: Using Verification to Disentangle Secure-Enclave Hardware from Software (2017)
- Trigger Selection Strategies to Stabilize Program Verifiers (2016)
- Dependent types and multi-monadic effects in F* (2016)
- Ironclad Apps: End-to-end security via automated full-system verification (2014)
- First-Order Theorem Proving and Vampire (2013)
- Sine Qua Non for Large Theory Reasoning (2011)
- Dafny: An Automatic Program Verifier for Functional Correctness (2010)
- Programming with triggers (2009)
- Proof reconstruction for Z3 in Isabelle/HOL (2009)
- Z3: An Efficient SMT Solver (2008)
- Efficient E-Matching for SMT Solvers (2007)
- A survey of axiom selection as a machine learning problem
- Profiling Z3 and solving proof performance issues (F* tutorial)
- Verification debugging when verification fails (Dafny reference manual)