Formal verification techniques, by paper
(authored by agents unless marked π§)
432 techniques from 74 audited full-text paper studies, as of 2026-10-13. Studies not yet audited against their paper are left out until they are. Each line is the one-sentence summary a study gives; the study has the steps, the Verus form, the evidence and the limits. This page is generated by a script from the studies. Pages that merge the same technique across papers: by stage of work.
DafnyBench: A Benchmark for Formal Software Verification
- verified-source corpus: assemble independently replayed programs from multiple sources, deduplicate them, and retain contracts as ground truth
- fill-hints benchmark: remove body assertions and invariants while freezing requires/ensures and rejecting verifier escape hatches
- bounded diagnostic retries: rerun a failed proof with the exact verifier error for a fixed number of attempts
- difficulty stratification: report proof success by source size and removed-hint volume, not only one aggregate
- contamination control: quarantine training repositories and document source overlap before comparing models
DafnyPro: LLM-Assisted Automated Verification for Dafny Programs
- annotation-only diff checking β strip generated annotations and require identical base code before verification
- greedy invariant pruning β remove verifier-reported non-inductive clauses and retry proof
- reusable hint retrieval β give the LLM a fixed set of eight manual structural proof tactics, selected per attempt, for later generations
- verifier-feedback fine-tuning β train on successful and failed attempts paired with verifier errors
VERINA: Benchmarking Verifiable Code Generation
- compositional verifiable-code benchmark β represent description, code, pre/postconditions, proof, and tests as independently composable tasks
- coverage and mutation assurance β require full reference coverage and categorized mutated negatives before scoring models
- proof-plus-testing specification evaluator β prove soundness/completeness implications, then use tests and property-based generation with explicit unknown status
- modular task pipelines β score CodeGen, SpecGen, ProofGen separately and in specification-guided, inference, and end-to-end compositions
- iterative verifier-feedback repair β feed Lean compiler errors back into repeated proof generation and report pass@k against direct generation
P^3: Joint Program-and-Proof Planning for Verified Code Generation
- joint plan Ο β enumerate contract, decomposition, library support, bridging invariant, proof cases, and auxiliary lemmas before implementation; reject plans that cannot entail the postcondition
- plan-gated elaboration β emit code and proof scaffold from the same plan, repair localized verifier goals, and replan when an unplanned invariant or algorithm is required
- proof-friendly decomposition β compare structural recursion and folds by the invariants they induce; generalize accumulator predicates before coding when needed
- relational specification QA β require reference satisfaction, mutation rejection, and non-vacuity review, with a quantitative admission threshold before benchmarking
- explicit phase gates β require read-only specifications, PASS-PLAN, mechanical checks, and instruction compliance before delivery
- restart-aware evaluation β report solve rates, costs, times, and full-restart frequencies with task denominators and single-run limitations
AlgoVeri: An Aligned Benchmark for Verified Code Generation on Classical Algorithms
- aligned cross-language contracts: encode one algorithmβs global predicates and witnesses in Dafny, Verus, and Lean so scores isolate toolchain effects
- satisfiability and degeneracy audit: prove each specification clause is satisfiable and show that removing it permits an unintended behavior
- compiler-in-the-loop prove-and-repair: iterate complete implementation/proof outputs using verifier diagnostics, then apply a separate semantic validator
- iso-compute depth/width evaluation: compare sequential repair chains with parallel samples under equal inference budget
- syntax/search barrier diagnosis: classify parser, type, VC, and tactic-search failures to target language-specific interventions
AlphaVerus: Bootstrapping Formally Verified Code Generation through Self-Improving Translation and Treefinement
- cross-language verified bootstrapping β translate verified Dafny programs into Verus to create scarce training exemplars
- Treefinement β verifier-error-guided branching repair over complete programs
- critique filtering β neural alignment and exploit checks reject specifications or implementations that game verification
- iterative prompt self-improvement β accumulate verified pairs and error trajectories across rounds without fine-tuning
Automatically Building Machine-Checked Assurance Cases from C Codebases to Requirements
- specificationβproof co-evolution β iteratively revise VST contracts and proofs together using proof failures as semantic feedback
- resource-aware interface protocol β model legal open-library call sequences with states, guards, branches, ownership, and edge subsumption
- input-aware protocol soundness β obtain conditional safety for realized runs under implementation satisfaction and caller obligations
- evidence-producing verification gates β freeze inputs, audit proofs/axioms, and require human conformance review before delivery
- covering witness β require one satisfiable run exercising every interface to block vacuous protocol proofs
VeruSAGE: A Study of Agent-Based Verification for Rust Systems
- standalone dependency extraction β use Verus
log-allto build a single task with dependency signatures, preserved contracts, and proof bodies removed - hands-off verifier loop β let a coding CLI repeatedly edit Rust, run Verus, inspect
vstd, and run a cheat checker under container isolation - plan-then-act proof agents β choose specialized logical, arithmetic, quantifier, or context actions from static resources and failure history
- strategy-specific candidate acceptance β permit temporary new errors for valid case splits but require strict decreases for local solver repairs
- solver and lemma selection β apply
bit_vector, nonlinear or integer-ring reasoning,vstdlemmas,broadcast use, andchooseaccording to obligation shape - invariant and opacity handling β strengthen state-machine invariants inductively and use lemmas about closed spec functions instead of exposing their bodies
- verifier-grounded evaluation β report task-level numerator and denominator, reruns, cost, time, syntax errors, cheating, and trusted assumptions separately
Whatβs in a Proof? Analyzing Expert Proof-Writing Processes in F* and Verus
- proof-process telemetry: record edits, verifier calls, diagnostics, pauses, lookups, and comments as annotated states
- specification-first decomposition: draft contracts, split subgoals, and replace temporary assumptions incrementally
- clean-error frontier: keep active verifier errors bounded and interpret each changed obligation before retrying
- representation-aware specification: choose data structures and quantifier forms that match implementation and solver behavior
- library retrieval: retrieve and adapt existing lemmas and documentation for the current proof state
- planner/syntax agent split: have one agent design specifications and another produce language-correct proof code under verifier feedback
WybeCoder: Verified Imperative Code Generation
- hybrid SMT plus interactive proof repair β generate imperative verification conditions, discharge routine goals automatically, and use interactive theorem agents for residual goals
- contract-directed loop invariant synthesis β express prefix/state relations, bounds, preservation, exit, and termination for mutable loops
- sequential compiler-feedback agent β alternate complete code generation with verifier diagnostics until success or budget exhaustion
- subgoal decomposition and proof transfer β solve named obligations in parallel, reconstruct proofs, and preserve unchanged proofs across goal-directed edits
- imperativeness and leakage control β allow functional ghost specifications while screening executable code for reference-function wrappers
- unsatisfiable-contract disproof β prove a preconditioned counterexample theorem when no implementation can satisfy the postcondition
- frame-aware specification engineering β state permutation, untouched regions, and decomposition contracts before asking agents to prove algorithms
Reducing the Costs of Proof Synthesis on Rust Systems by Scaling Up a Seed Training Set
- checker-filtered self-synthesis β repeatedly generate Rust/spec/proof triples, deduplicate, verify, debug, and retrain
- tutorial curriculum synthesis β seed every verifier knowledge point and oversample weak feature coverage
- trajectory CoT distillation β train on complete agent actions and verifier-feedback reasoning from real system proofs
- accuracy-at-k cost evaluation β report probability of at least one verified proof among K samples with dollars per task
Toward Practical Deductive Verification: Insights from a Qualitative Survey in Industry and Academia
- critical-component targeting β rank criticality, adoption, requirement clarity, stability, and realizability, then prove high-value components and use lighter checks elsewhere
- incremental verification β co-develop contracts and code from early design through CI while stabilizing interfaces
- modular proof decomposition β split by code, property, or refinement and restrict solver context with lemmas and abstractions
- specification validation β check formal contracts against intent, documentation, and concrete tests; proof success alone is insufficient
- guided automation β combine default automation with user-controlled context, diagnostics, counterexamples, and intermediate states
- proof maintenance β keep proofs small, repair against prior versions, and monitor assumptions at unverified boundaries
- hybrid assurance β combine deductive verification with testing, static analysis, model checking, runtime monitoring, reviews, and CI
Unfolding Iterators: Specification and Verification of Higher-Order Iterators in OCaml
- permitted/complete iterator contracts β specify visited values and termination independently of implementation
- cursor reduction β translate higher-order calls into first-order loops with convergence and client invariants
- effectful iterator invariants β relate mutable state such as stacks to the visited prefix
- nested-history propagation β carry outer accumulator/visited state into inner iterator invariants
- graph-set iteration contracts β use subset, distinctness, and cardinality for vertex/successor traversals
- fold basis for adapters β express iter, map, and filter as degenerate folds with one translation schema
Tunable Automation in Automated Program Verification
- broadcast quantified facts β mark proved lemmas as reusable quantified context and group them for import
- scope and trim automation β develop with broad groups, inspect likely UNSAT-core usage, then narrow imports
- assertion minimization β remove hints one at a time and rerun verification to estimate automation gain
- trigger-guided instantiation β choose syntactic patterns that occur at the proof obligation and avoid matching loops
- selective all-triggers mode β broaden trigger sets for user quantifiers only after measuring proof and runtime effects
VeriStruct: AI-assisted Automated Verification of Data-Structure Modules in Verus
- planner decomposition β schedule View, invariant, contracts, and proofs as separate generation tasks
- View abstraction β map concrete data structures to logical sequences/maps used in contracts
- type invariants β attach and invoke representation invariants across methods
- verifier-diagnostic repair β classify Verus errors and apply targeted annotation patches
- syntax-guided prompting β include Verus tutorial/library rules and examples in prompts
Synthesizing Proofs Using Proof Sharding and Exploration
- proof sharding β split disjunctive preconditions and conjunctive postconditions into independently checked lemmas while reusing existing proofs
- bounded expression synthesis β enumerate typed annotation expressions by a recursive complexity budget
- trigger synthesis and covering β generate E-matching terms and check singles/pairs in covering batches
- helper-lemma invocation β call existing acyclic lemmas with synthesized arguments
- opaque-definition reveal β locally unfold hidden definitions only when a candidate changes verification
- quantifier elimination β expose quantified variables so later trigger and lemma searches can use them
- parallel proof backend β distribute candidate obligations across prover instances with round-robin scheduling
Towards Large Language Model Aided Program Refinement
- law-guided generation: make the model choose a small refinement law and check its logical proviso before accepting code
- flexible termination rule: require invariant preservation, decreasing progress, and a no-fixed-point assertion for real-valued loops
- traversal refinement: express list recurrence as an indexed invariant and prove one-step preservation before incrementing
- active/passive verifier loop: synthesize prompts from the current specification and feed Coq/ATP failures back into bounded search
- refinement-tree reuse: persist successful specification/code paths and retrieve them for later tasks with matching contracts
Verifying the Rust Standard Library
- rewarded verification challenges β publish scoped targets, assumptions, acceptance tests, and reviewable pull requests so a changing library can be verified by a distributed community
- MIR nondeterministic harness synthesis β enumerate eligible monomorphic functions, call them with symbolic
anyvalues, and check contracts or supported UB on all explored paths - invariant-aware input generation β distinguish bit-valid representations from semantic safety invariants and assume only explicit
is_safepredicates - bounded versus inductive loop proofs β use unwinding assertions for finite bounds or loop contracts for invariant-based proofs independent of the bound
- separation-logic ownership predicates β recursively own linked heap nodes with separating conjunction and transfer resources through pre/postconditions
- multi-tool continuous verification β combine model checking, refinement types, and separation logic in CI because each covers different Rust behaviors
- proof-pipeline performance engineering β benchmark compilation, then apply parallelism, caching, ordering, and stubbing while recording the resulting trust boundary
Teaching Code LLMs to Reason with Intermediate Formal Specifications
- executable checkpoint specifications β place Boolean obligations at internal states so traces expose algorithmic commitments before final output
- mutant-guided supervision β retain syntax-preserving mutants that pass some tests and fail others, then train on assertions that reject them
- ExploreβSubmit refinement β iteratively execute candidate assertions on references and mutants, using localized feedback before acceptance
- dual specification/code training β fine-tune separate insertion and complete-program tasks over accepted annotated programs
- four-way specification evaluation β measure executable validity, reference correctness, eligible-mutant completeness, and downstream repair separately
- evidence-driven repair β feed violated checkpoint assertions to correctness checkers and repair agents as machine-checkable local evidence
The Secrets Must Not Flow: Scaling Security Verification to Large Codebases
- Core/Application decomposition β isolate a protocol implementation and expose an invariant-bearing API
- I/O independence taint analysis β reject secret-dependent protocol-irrelevant I/O across the whole codebase
- Core refinement with I/O permissions β prove protocol-relevant operations are trace-included in a verified model
- static Application discharge β use alias, escape, pass-through, locality, and memory-access analyses to satisfy Core assumptions
- virtual I/O boundaries β model callbacks and module transfers as protocol events with permissions
- ghost permission instrumentation β track local, invariant, and global shared heaps to compose Core proofs with Application code
VerifyThisBench: Generating Code, Specifications, and Proofs All at Once
- end-to-end verification benchmark construction β turn natural-language, competition-vetted challenges into tasks requiring specification, implementation, and machine-checked proof
- unified verifier execution β pin tools, prompts, hardware, timeout, and pass criterion so results are comparable across frameworks
- diagnostic iterative refinement β feed compiler and verifier errors plus prior attempts back to the model for bounded repair rounds
- artifact deletion ablations β remove code, specifications, or loop invariants separately to measure the corresponding model skill
- outcome taxonomy β distinguish no generation, compilation failure, timeout, partial proof, and complete success
- independent coherence checking β assess whether a passed formal specification matches the original natural-language intent
- per-tool/per-model evaluation β retain framework-specific rates because model strengths and syntax compatibility differ
Refactoring and Equivalence in Rust: Expanding the REM Toolchain with a Novel Approach to Automated Equivalence Proofs
- rust-analyzer semantic extraction β delegate Extract Method to RAβs inferred types, lifetimes, generics, and control-flow semantics
- persistent semantic workspace β merge a cached standard-library graph with a minimal single-file graph for fast complete inference
- compiler-guided lifetime repair β iterate signature and call-site edits from borrow-checker diagnostics and lifetime-elision rules
- translation-based equivalence proof β translate original and refactored Rust through CHARON/AENEAS and prove equality in Coq
Sound Borrow-Checking for Rust via Symbolic Semantics
- local-and-hybrid simulation proofs β replace a global state relation with local rewrites, prove preservation in a hybrid union language, and recover endpoint simulation through stability
- heap bridge for valued borrows β relate borrow/loan states to pointers and locations, then connect locations to an explicit heap with a global address invariant
- step-indexed divergence β add fuel to big-step semantics so safe divergence is represented and simulated across languages
- symbolic region borrow checking β instantiate function signatures with fresh symbols and region abstractions, then accept only states related to the signatureβs final state
- directional region merging β use a one-way merge of loan/borrow pairs to abstract lifetimes without allowing cyclic ownership states to pass
- join-collapse analysis β pointwise-join branch environments with origin markers, collapse duplicates, and require an unmarked result before continuing
- alpha-equivalent loop fixpoints β normalize anonymous mappings and compare ownership shapes up to fresh loan/region identifier substitution
- deterministic-backend bisimulation β compose forward simulations with deterministic PL execution to obtain a backward direction for programs that pass the checker
Quantifying SMT Solver Instability for Formal Verification
- mutant-family stability testing: generate semantics-preserving query variants and measure runtime spread
- coefficient-of-variation reporting: normalize spread by baseline difficulty and expose timeout censoring
- runtime-guided query normalization: search equivalent lemma and trigger structures for faster, more stable solving
- proof-quality separation: report truth, acceptance, cost, and stability as distinct measurements
Surveying the Rust Verification Landscape
- property-and-dependency prioritization: classify safety, functional, and domain properties, then start at foundational libraries
- bounded exploration with explicit residual bounds: use model checking for finite behavior and report what remains unbounded
- intrinsic contract extraction: translate documentation into reviewed machine-readable assumptions and track implementation guarantees separately
- verifier choice by trust and annotation budget: match automation, unsafe support, proof strength, and human effort to the target
PropertyGPT: LLM-driven Formal Verification of Smart Contracts through Retrieval-Augmented Property Generation
- intermediate property language β constrain generated invariants, pre/postconditions, and rules in a compiler-checked grammar
- code-keyed retrieval augmentation β embed critical code, retrieve similar audited examples, and use their properties as one-shot context
- type-specific prompting β use separate strict templates for rules and function contracts with symbol and name restrictions
- compiler-feedback repair β iterate on compiler diagnostics with a bounded retry loop, then statically check target-function coverage
- weighted candidate ranking β combine raw and summary similarities to choose a prover budget while retaining auditability
- strongest-postcondition verification β symbolically execute source semantics, prove modular obligations, and investigate BMC counterexamples
- conservative semantic modeling β represent external calls and nonlinear operations explicitly, recording assumptions and bounds
Resource Specifications for Resource-Manipulating Programs
- first-class resources β represent conserved assets directly in specifications with explicit operations
- coupling invariants β two-state invariants tying resource state changes to program state changes, enforced as postconditions
- default conservation obligations β make create/destroy/transfer semantics enforce conservation automatically
- concise contract comparison β compare specification lines, AST size/depth and verification time against a state-based baseline
ProofWright: Towards Agentic Formal Verification of CUDA
- permission contracts: use quantified and conditional ownership permissions, index helpers, and loop invariants to prove memory safety and race freedom
- persistent annotation guide: accumulate checked examples and verifier error repairs into a reviewed, domain-specific proof recipe
- graph-to-library specification: turn a high-level program into a typed operation graph and reusable formal operator definitions
- theorem-based semantic lowering: prove an optimized implementation equivalent in a theorem prover, then lower the theorem to executable-code postconditions
Sound Borrow-Checking for Rust via Symbolic Semantics (Long Version)
- simulation-chain soundness β prove abstract-to-concrete forward simulation and, for accepted programs, concrete-to-abstract backward simulation
- borrow-centric LLBC modeling β represent loans, borrows, reborrows, moves, and invalidation explicitly
- heap refinement β relate borrow-centric states to pointer/location semantics through local transformations
- symbolic function checking β initialize fresh values and region abstractions from signatures, then check the body against expected outputs
- partial-state framing β compose local symbolic states with unchanged disjoint caller frames
- join and collapse β merge branch environments conservatively, track origins, and normalize marked duplicate borrows
- identifier-renamed loop fixpoints β iterate joins while comparing borrow graphs up to fresh loan/region renaming
- heuristic-failure accounting β require mark-free collapse and bounded convergence, treating failures as incompleteness
Place Capability Graphs: A General-Purpose Model of Rustβs Ownership and Borrowing Guarantees
- compiler-connected place capability graphs β represent every MIR program point with capability-bearing places and lifetime projections derived from Rustβs own analyses
- unpack and pack ownership transitions β split composite capabilities to check field moves/borrows and merge them only when all fields are available
- lifetime-projection borrow tracking β summarize stored borrow sets and connect lenders, references, dereferences, and expirations with typed edges
- future projections for nested reborrows β defer updates to inaccessible nested borrow sets and materialize them when the owner becomes available
- path-labelled graph joins β retain branch-specific borrow flow while sharing common graph structure at CFG joins
- abstraction edges for calls β summarize returned and mutated borrows from function signatures without inlining callees
- compiler-guided loop invariants β derive blocker/blocked places and replace loop subgraphs with a borrow-preserving invariant graph
- PCG-driven verifier annotations β turn pack/unpack, loop, and abstraction transitions into Prusti-style separation-logic proof obligations
SaltBench: A Referee-Gated Protocol for Measuring Method Effects in Machine-Checked Software Work
- referee isolation and world freeze: pin toolchain, hide references, fence network, and freeze predictions before scoring
- AST anti-weakening gates: reject admits, assumptions, external bodies, and unauthorized changes before invoking Verus
- budget-stop semantics: distinguish halt, failure, inexpressible, and pass in the result schema
- external adjudication records: keep runner, parser, referee output, cost, and trust-boundary facts outside agent control
Reasoning about Interior Mutability in Rust using Library-Defined Capabilities
- library-defined implicit capabilities: annotate interiorly mutable APIs with conditional or unconditional facts such as local, immutable, unique, and deny-reference properties, then derive client framing and aliasing
- capability implication and framing: propagate capabilities through fields and pointees, weaken them, use incompatibility for non-aliasing, and carry immutable or unique facts across statements
- conditional capabilities: guard a capability with a runtime predicate such as
Arc::strong_count(self) == 1so proofs follow the state actually established by a branch - purity footprints: classify methods as pure, pure-memory, or pure-unstable and add postconditions for unstable reads to control framing
- conversion-method validation: justify shared-reference immutability by an observationally equivalent rewrite that keeps a converted reference alive across an unknown call
- first-order capability encoding: model versioned memory, root places, snapshots, and capability axioms in Viper/Boogie for automated verification
StateSync-GKR: Machine-Checking the Trust Chain from Sparse-Merkle State Transitions to GKR Verification
- semantic transition model β define operations, states, witnesses, and validity before compiling or proving protocol properties
- residual circuit compiler proof β encode constraints as zero residuals and prove circuit acceptance iff a canonical valid witness exists
- layered GKR assembly β combine multilinear layer identities, imported sumcheck, two-point carries, and induction into a chain-event bound
- semantic-to-protocol composition β transfer invalid transition semantics through compiler equivalence to a bounded bad-chain event
- nonvacuity activation β register concrete premise witnesses and fire every theoremβs assumptions so vacuous proofs are detected
- partial refinement ledger β anchor Rust clauses to model facts while naming open obligations, black boxes, and undischarged correspondence premises
Schwarz: Solver-Aware Agentic Program Verification
- SMT-local lemma repair: decompose a timeout or unknown into a checked, program-point obligation and lift successful lemmas back into source
- theory-aware policy: choose ghost summaries, arithmetic, bit-vector, memory, or quantified encodings according to the obligationβs semantics
- proof snapshots: cache validated boundaries for local repair, then regenerate and check the entire proof from original source
- short diagnostic timeouts: fail local hypotheses quickly so the agent can test context and theory alternatives
- trust-boundary harness: keep lowering, solving, and concrete replay deterministic while the LLM searches untrusted artifacts
Scaling Verification of Cryptographic Software with Aeneas, Rust, and Lean
- Aeneas extraction: translate ownership-safe Rust MIR into pure Lean values and explicit failure results
- monadic step automation: advance extracted code one operation at a time while discharging preconditions and postconditions
- proof-only decomposition: fold large extracted functions with kernel-checked equality rewrites
- theory-specific tactics: combine scalar/list simplification, arithmetic-domain conversion, and bitvector decision procedures
- multi-target extraction: merge per-architecture MIR while preserving target-specific branches
- intrinsic shims and axioms: model vendor instructions over lane arrays or reviewed standard-linked axioms
- ghost streaming state: relate incremental runtime APIs to one-shot standards through absorbed and emitted histories
- specification-level termination: prove finite-state permutation or bound properties before lifting termination to code
OSVBench: Benchmarking LLMs on Specification Generation Tasks for Operating System Verification
- fixed declarative invariants β freeze safety predicates while generating state-machine transitions so verification cannot pass by weakening the property
- typed state-machine synthesis β constrain generated specifications with an explicit AST, extracted constants, and utility functions
- long-context syscall prompting β combine assumptions, programming model, oracle examples, and a target description in a structured prompt
- realistic vulnerability injection β test specifications against pointer, privilege, leak, overflow, and bounds mutations while holding intent fixed
- oracle-equivalence evaluation β compare generated and oracle verifier results across implementations, separating syntax from semantic errors
- verifier-guided self-repair β feed generated specifications and kernel diagnostics back for bounded repair rounds
Large Language Models and Language Server Protocol: a match made in context
- context-indexed generation β index project symbols and contracts, then give only legal, relevant context to a parser-gated model request
- model-based contract synthesis β generate candidate preconditions and postconditions, filter names and calls, and retain additions only after the paperβs stated validity checks
- isolated body repair β test a generated body in a temporary override or harness and copy it back only after verification
- verifier-feedback transactions β feed diagnostics into bounded retries while restoring the last stable source on failure
- granularity and ablation measurement β compare feature versus class repair and full versus minimal prompts with explicit success denominators, attempts, time, and cost
A Hybrid Approach to Semi-automated Rust Verification
- safety-boundary hybrid: send safe Rust to Creusot and unsafe modules to Gillian-Rust through shared contracts
- ownable representation predicates: connect concrete pointer heaps to abstract sequences with
Ownableand separation logic - guarded mutable-borrow automation: unfold, mutate, fold, and resolve RustBelt-style lifetime guards automatically
- prophecy-based functional correctness: specify mutable-reference final values with
^and parametric prophecy observations - dual contract compilation: elaborate Pearlite
hybridattributes into Creusot and Gilsonite specifications - symbolic unsafe execution: use layout-independent heap objects, pointer arithmetic, path conditions, and predicate unfolding
Lemur: Integrating Large Language Models in Automated Program Verification
- assumption-trail decomposition β represent a hard invariant as verifier-checked implications through a trail of smaller predicates
- sound propose/decide/repair/backtrack calculus β search with explicit transitions while proving LLM suggestions before accepting them
- stable case split β prove both q and not q implications when q is stable, even if q itself is not invariant
- bounded terminating search β cap proposals and require a decreasing subgoal rank to return SUCCESS, FAIL, or UNKNOWN
- verifier-facing prompt grammar β use named program markers, strict assertion output, repeated sampling, and AST deduplication
- backend cooperation β combine LLM high-level predicates with BMC, k-induction, abstraction, or Verus SMT checking
Neuro-Symbolic Software Verification: Hyper-charging Local Language Models with Symbolic Reasoning at Scale
- ESBMC invariant oracle β classify atomic and whole-program invariant obligations as provable, disprovable, or unknown, accepting only successful checks
- Phase 0 baseline β run the verifier on the unannotated program and synthesize only after an unknown result
- symbolic atom enumeration β instantiate variable/constant relations, verify each atom, and conjoin the provable store
- verifier-feedback refinement β prompt a local LLM with P/D/U, decompose failed formulas, and recombine verified atoms
- CoT prompt families β guide proposals with inductive, Hoare, or Horn-clause few-shot examples while retaining verifier gating
- ToT verifier scoring β scout four prompt strategies, score by verified atoms, and refine the top two with bounded rounds
- dual-LLM correction β pass one modelβs proposal and verifier stores to a second model, then independently verify and recombine outputs
Interactive Safety Verification of Distributed Protocols by Inductive Proof Decomposition
- inductive proof graph β represent lemma dependencies and one action node per transition branch
- relative induction supports β prove each lemma from a small support subset instead of the full conjunction
- CTI-guided backward development β choose a failed node and add a lemma that excludes its localized counterexample
- local variable slicing β restrict candidate support predicates to precondition, lemma, and update cone variables
- node-local proof status β track discharged action nodes and graph structure as an interpretable progress measure
- bounded CTI plus final proof β use TLC/Apalache for finite counterexamples and TLAPS for unbounded validation
- guarded-action modeling β expose named transition branches and deterministic update expressions for decomposition
- induction-cycle analysis β inspect strongly connected lemma dependencies to understand distributed proof structure
Lessons Learned So Far From a Community Effort to Verify the Rust Standard Library (work-in-progress)
- symbolic Kani harness β use
kani::any()plus assertions and loop invariants for bounded safety proofs - property-specific verifier selection β combine Kani, VeriFast, Flux, and deductive tools by code property
- shadow-memory dataflow β track initialization or pointer provenance as finite-state client obligations
- generic instantiation harnesses β run concrete monomorphizations to approximate generic-function coverage
- concurrency decomposition β justify sequential proofs via ownership or use concurrency-capable verification
- challenge traceability β tie unsafe functions to peer-reviewed CI-checked verification challenges
Leveraging Large Language Models for Automated Proof Synthesis in Rust
- segment-interface synthesis β split long functions and use GPT-generated postconditions as the next segmentβs preconditions
- verifier-checked invariant generation β ask GPT-4 for Verus invariants and retain only code that Verus accepts
- read/write invariant propagation β copy incoming predicates that read but do not write loop variables into loop invariants
- bounded error-feedback repair β retry with exact Verus diagnostics and accept only a subsequent verified proof
KaPilot: LLM-Assisted Generation of Kani Specifications for Unsafe Rust Verification
- documentation-derived safety requirements β extract atomic, source-traceable memory and panic properties before writing contracts
- harness and metadata preparation β build symbolic-input Kani entry points and store type/API context for generation
- implementation-blind contract generation β generate Kani preconditions, postconditions, and invariants from requirements, metadata, API knowledge, and few-shot examples
- semantic precheck β reject uncovered or badly strengthened/weakened contracts before verifier execution
- contextual repair and vacuity testing β feed counterexamples and failure classes back, then append an impossible postcondition to expose unreachable assumptions
- shuffle-and-implication selection β combine weakest preconditions, strongest postconditions, and compatible loop invariants across verified candidates
Kani: A Model Checker for Rust
- bounded proof harnesses β use
kani::any, checked assumptions, assertions, and a completeunwindbound to exhaustively check finite executions and Rust safety properties - function and loop contracts β prove preconditions, postconditions, frame conditions, invariants, and integer decreases measures, then reuse verified behavior compositionally
- quantified specifications β express
forallandexistsover finite or SMT ranges, selecting a backend while checking instantiation and range cost - verified and environmental stubs β replace a proved callee by its contract, or model FFI and clocks with explicit trusted nondeterministic abstractions
Knowledge Graphs, the Missing Link in Agentic AI-based Formal Verification
- trace-linked specification context: connect requirements, code locations, assumptions, obligations, and evidence in a queryable graph
- evidence-separated repair loops: handle syntax, counterexamples, and coverage as distinct workflows
- coverage-directed specification growth: use uncovered behavior to generate and track additional obligations
- provenance-preserving retrieval: retain links across edits so repairs remain tied to original intent
Executable JavaScript as a Checkable Specification Language: A JS-SAM Case Study on SysMoBench
- trace-window conformance: instrument the real system and replay
(pre, action, post)windows against a generated transition model - observable-state projection: compare only implementation-visible keys while allowing private model bookkeeping
- executable transition contract: require a deterministic self-contained module with init, actions, state projection, reset, and finite intents
- sandboxed specification execution: run untrusted generated code in a resource-limited no-network container
- counterexample repair: regenerate from complete transition failures, then test held-out domains and inspect for memorization
- semantic-state accounting: distinguish checker step counts from unique reachable states
Can LLMs Reason Like Automated Theorem Provers for Rust Verification? VCoT-Bench: Evaluating via Verification Chain of Thought
- VCoT lifting: transform a complete Z3 trace into mapped Verus assertions, invariants, and lemmas using global context
- rule-specialized completeness checking: aggregate high-level proof segments, filter trivial/redundant facts, and require explicit Z3-to-Verus mappings
- transformerβchecker iteration: regenerate the whole lifted proof when targeted checkers find missing essential steps
- proof pruning: remove justified trivial, normalization, reassertion, and definition-expansion steps, then recheck
- verifier-in-the-loop repair: feed Verus syntax/semantic diagnostics to a repair agent until compilation and verification succeed
- semantic-block benchmark construction: remove lemma, invariant, or assertion blocks at ratio, type, and location strata
- dual scoring: separate Verus syntax checks, semantic judging, and weighted overall accuracy
Can LLMs Enable Verification in Mainstream Programming?
- staged information modes β vary whether the model receives code, contracts, specifications, or natural language to isolate automation difficulty
- verifier-in-the-loop repair β pass verifier diagnostics back for bounded candidate refinement
- specification implication validation β prove generated contracts imply a human- or benchmark-owned reference contract
- deterministic syntax cleanup β repair recurring language syntax before another model call while preserving semantics
- error taxonomy routing β map type, invariant, assertion, timeout, and arithmetic failures to targeted repair strategies
ExVerus: Verus Proof Repair via Counterexample Reasoning
- source-level SMT counterexample synthesis β translate a failing Verus obligation into readable Z3Py over source variables and solve for concrete violating states
- loop-based counterexample validation β execute injected states against loop-start/end assertions in Verus to filter invariant examples
- triage-directed mutation β classify examples as reachable or spurious and select replace or strengthen mutators
- blocked-counterexample ranking β rank candidate proof mutations by validated examples they eliminate, then re-verify with Verus
Flux: Liquid Types for Rust
- indexed refinement APIs β index values and collection measures in types so safety preconditions become ordinary typed calls
- ownership-aware strong updates β use Rust ownership and strong references to track mutation that changes a refinement index
- polymorphic quantified invariants β encode universal container properties in refined element types and infer them with quantifier-free Horn constraints
- liquid loop inference β spatial mapping, Horn generation, and fixpoint solving synthesize loop invariants without user annotations
Enchanting Program Specification Synthesis by Large Language Models Using Static Analysis and Program Verification
- loop-aware call graph: represent functions and loops as proof nodes and generate contracts from callees upward
- hierarchical specification rounds: ask for local candidates, validate them, retain them, and revisit nodes until adequacy or a fixed bound
- satisfiability/adequacy filter: reject illegal or inconsistent clauses, then separately test whether the target assertion is proved
- few-shot local prompting: give the LLM only the component, relevant callees, a placeholder, and matching specification examples
- deletion simplification: remove clauses one at a time and replay the target proof to obtain a smaller checked specification
Corten - Foundational Verification of Rust Programs
- THIR source-near embedding β transpile Rust THIR with hax2rocq into Rocq so proof goals pretty-print to source-level syntax
- fractional ownership forest β represent values as recursive points-to facts with rational permissions and abstract layout
- move and reborrow WP β exchange initialized ownership for uninitialized ownership and return exclusive borrows through separating implications
- control-flow WP monad β model return, break, continue, match failure, and normal sequencing with tagged outcomes and guards
- syntax-directed expression WPs β separate place/value contexts and structurally account for moves, temporaries, overflow, tuples, ADTs, and calls
- modular function contracts β prove persistent
fn_item_okspecifications and reuse them at every call site - ITree adequacy β derive event-aware WPs from interaction-tree denotations and prove semantic rules incrementally
- definition sealing β expose one-step block lemmas while keeping recursive WPs opaque
- independent WP reordering β evaluate side-effect-free pattern constants before scrutinees under a sealed continuation
- join-point reasoning β discharge branches or loop iterations against one shared intermediate postcondition and prove the continuation once
- defunctionalized continuations β replace closure trees with sealed first-order sequential and handler stacks
- deterministic WP automation β normalize, dispatch by syntax, sequentialize control flow, and solve separation side obligations with fallback manual proof
- hand-oracle construct testing β validate axioms against documented Rust behavior separately from ITree adequacy
- invariant-driven allocator proof β preserve abstract free-list representation and ownership through
&mut selfcalls while hiding concrete state
Dissect-and-Restore: AI-based Code Verification with Transient Refactoring
- transient loop lifting β extract nested loops into one-loop helpers, verify, then restore original structure
- proof-tree decomposition β recursively split complex obligations into helper lemma nodes with tracked code and contracts
- feedback-driven repair β regenerate annotations using verifier diagnostics and bounded retries
- rollback with annealing β DFS search with parent rollback and decreasing model temperature after failures
- proof-outline guidance β use optional natural-language strategy to steer generated induction and helper lemmas
- restoration verification β recompose verified fragments and rerun the verifier on the original shape
Combining Mechanical and Agentic Specification Inference for Move
- mechanical WP baseline β lower contracts to a reference-free, instrumented form and derive aborts, frames, and postconditions by backward propagation
- agent loop-invariant synthesis β infer inductive counter, sequence, arithmetic, and resource facts, then let the prover reject invalid proposals
- contract simplification β replace vacuous or solver-hostile WP formulas with bounded, readable equivalents and checked triggers
- timeout escalation β strengthen invariants, add helpers, add lemmas, and use proof scripts without weakening properties
- state-transition resource specs β use frames, old-state values, and intermediate snapshots to specify multi-address global updates
- enforceable agent plugin β combine ordered skills, inferred markers, edit hooks, cached MCP tools, and prover feedback in an idempotent workflow
Baldur: Whole-Proof Generation and Repair with Large Language Models
- whole-proof generation β fine-tune on theorem-to-complete-proof pairs, sample many scripts, and accept only prover-checked candidates
- error-conditioned repair β provide a failed proof and exact verifier diagnostic to a repair model, then reverify its replacement
- theory-file context β prefix a theorem with nearby definitions and proofs so generation can copy or adapt local patterns
- repeated repair search β chain generation and repair attempts under a fixed inference budget, checking every result
- verified ensembles β combine independent model samples or complementary provers and count the union of accepted proofs
Borrowable Fractional Ownership Types for Verification
- borrowable fractional ownership β combine permission fractions with ordered borrow lifetimes to type dynamic aliases
- ownership-splitting rules β use share/borrow addition, full-permission assignment, alias redistribution, and lifetime end
- prophecy-pair reduction β replace each reference with current and future values in a heap-free target
- TXZ/PFZ invariants β connect positive ownership to current values and zero ownership to prophecy values
- alias and prophecy chains β preserve values across reborrowing with a sequence of linked prophecy equalities
- simulation soundness β prove target safety implies source safety through a step-indexed relation
Beyond Postconditions: Can Large Language Models infer Formal Contracts for Automatic Software Verification?
- NL2Contract inference β translate code-local natural language into typed preconditions plus postconditions and verify the result
- verification-guided soundness β conjoin the trusted reference precondition with inferred postconditions and check the reference in one verifier call
- mutation completeness β generate valid-input mutants and require verifier-found violations to measure discriminative power
- exception contract encoding β wrap precondition assertions as invalid-input exceptions and postconditions as executable assertions
- context-built prompting β include signatures, docs, imports, globals, class members, and called APIs to reduce hallucinated contracts
- verifier plus testing β reuse executable contracts as CrossHair assertions and Pynguin test oracles while preserving valid-input domains
Crux, a Precise Verifier for Rust and Other Languages
- symbolic unit tests β instantiate symbolic Rust values, constrain them with
crucible_assume!, assert properties withcrucible_assert!, and search exhaustively for counterexamples - executable extensional equality β compare bit-precise implementation outputs and panic behavior with Cryptol, hacspec, or Rust reference functions
- compositional specifications β prove a helper once with
#[crux_spec_for], enable it in callers, and replace expensive calls with its simpler model - MIR-to-SMT symbolic execution β extract MIR, translate to Crucible, merge branch states, and discharge negated assertions with an SMT solver
- bounded memory modeling β represent typed allocations and reference paths while rejecting most raw-layout casts and pointer arithmetic
- factorized loop verification β prove one-iteration helper equivalences and compose them to make large cryptographic loops tractable
Compositional Reasoning for Side-effectful Iterators and Iterator Adapters
- four-component iterator contracts β define
produced,completed,step, and transitiveleadsto, then enforce Q1βQ5 onnext - closure call descriptions β connect generic adapter steps to closure arguments, results, and captured-state transitions
- compositional ghost histories β store intermediate iterator/closure states and use prefix plus quantified call relations for unbounded chains
- snapshot-based two-state specs β compare whole data-structure states as mathematical values suitable for SMT
- out-of-band conditional contracts β attach iterator postconditions through an extension trait and type-dependent external specification
Assured Automatic Programming via Large Language Models
- hard/soft intent extraction β partition verification conditions into preserved facts and repairable disagreements
- prioritized co-evolution repair β synthesize and validate multiple patches for one failing trace while preserving hard facts
- artifact conformance β iteratively align program and specification with verifier checks
- test-as-intent refinement β translate tests into specifications and use trusted tests to reject vacuous contracts
- postcondition completeness β score contracts by the fraction of output mutations they reject
- formal-to-natural intent summary β summarize trusted contracts and test whether regenerated code verifies
An Empirical Study of LLM-Generated Specifications for VeriFast
- separation-logic heap contracts β use recursive predicates, points-to ownership, loop footprints, folds/unfolds, and inductive lemmas to verify heap behavior
- staged retrieval prompting β select a verifier-aware prompt and model on pilots, retrieve examples, and split context at function boundaries
- behavior-drift auditing β compare generated code and contracts semantically before treating verifier acceptance as success
- diagnostic repair taxonomy β classify compiler, heap, lemma, invariant, source, and logical failures and repair the smallest missing obligation
- symbolic-heap feedback β expose verifier ownership state and combine automatic open/close inference with LLM repairs
AutoVerus: Automated Proof Generation for Rust Code
- invariant candidate generation and linear merging β generate five loop-invariant programs, filter and rank by
(V,E), then merge complementary annotations under Verus checks - monotonic generic refinement β sequentially add propagated preconditions, lengths, quantifier fixes, and conditional invariants while never reducing verified-function count
- error-directed repair agents β map Verus diagnostics to specialized repair prompts and iterate with verifier acceptance as the gate
- Houdini annotation minimization β test subsets of generated annotations to retain a sufficient proof
AxDafny: Agentic Verified Code Generation in Dafny
- verifier-guided repair loop β generate complete annotated code, run preservation/anti-bypass checks and Dafny, then repair from diagnostics with bounded memory
- contract-preservation filter β require original
requires/ensuresto remain a subset of the candidate - anti-bypass static and LLM review β reject
assume,{:axiom},{:verify false},{:extern}, and semantic tautologies - counterexample feedback β enable Dafny counterexamples to expose invalid proof obligations concretely
- dual verification/runtime evaluation β report machine verification and compiled test performance as separate metrics
- curated verified-code benchmark β validate fixed specifications with parsing, type resolution, mutation, LLM, and manual checks before use
Auto-active Verification of Graph Algorithms, Written in OCaml
- contract plus variant β attach preconditions, postconditions, and a decreasing termination measure to existing recursive code
- modular model signatures β specify graph operations against an abstract finite-domain and successor model
- representation invariants β encode closure and edge symmetry on graph records and preserve them through mutators
- boundary axioms β assume algebraic properties of generic comparison operations at module interfaces
- certificate validation β prove a small witness checker and separately establish producer safety
- path predicate correspondence β relate executable list checks to a quantified sequence path definition
- BFS soundness and completeness β use queue reachability and frontier invariants to prove both true and false results
- ghost boundary extraction β find a predicate-crossing edge along a path to discharge existential completeness claims
- proof-oriented data-structure change β add marking state and ghost sets to make queue invariants disjoint and simpler
- prover-guided splitting β split verification conditions and add small lemmas when SMT automation cannot infer them
Automating Formal Verification with Agent-Guided Tree Search
- iterative replacement with compiler feedback β fill fixed formal holes, run the verifier, and retry from the original source using diagnostics while rejecting bypass constructs
- persistent verifier agent with library search β keep one context, search lemmas through a Lean/Verus service, submit code through a schema-checked tool, and scale the call budget
- state-based parent/subagent tree β branch short proof-state explorations, commit or undo partial states, and let a parent choose the next strategy
- context endpoint tree search β save full subagent transcripts, resume promising endpoints, and fork new advice from retained evidence to avoid repeated searches
- verifier-gated anti-cheating harness β count success only after kernel verification and explicit rejection of incomplete, axiomatic, unsafe, or native-code escapes
Automated Proof Generation for Rust Code via Self-Evolution
- Verus-compatibility translation β translate unsupported Rust constructs, compile with Verus, and discard non-compiling programs
- Specification score filtering β retain candidates with at least 80% correctness and 60% mutation completeness, up to three per function
- Verifier-filtered self-evolution β fine-tune on proofs that Verus verifies and iterate rounds until gains plateau
- Error-conditioned whole-proof repair β train on rejected proof, Verus diagnostics, and later verified proof, then reverify repairs
APOLLO: Automated LLM and Lean Collaboration for Advanced Formal Reasoning
- compiler-guided staged repair β feed verifier diagnostics into syntax cleanup, placeholder extraction, solver attempts, recursive repair, and final reverification
- sorrifier obligation extraction β turn invalid nested proofs into compilable placeholders that expose local sub-lemmas without accepting them as proved
- solver-first local closure β try deterministic arithmetic and rewriting automation on each obligation before invoking an LLM
- recursive sub-lemma proving β recurse on unresolved local contexts, then assemble and reject any proof containing placeholders
Automatic Generation of Formal Specification and Verification Annotations Using LLMs and Test Oracles
- static test oracles: retain statically checked output assertions so contracts must imply concrete intended results
- negative specification tests: uncomment assertions that should fail to expose weak preconditions or overly strong postconditions
- staged verifier-feedback repair: generate annotations, run the verifier, and iteratively repair the complete program from exact diagnostics
- proof-helper pattern catalogue: supply sequence, recursion, quantifier, and test-helper templates for recurring SMT failures
- dependency-aware minimization: delete generated declarations and clauses only when a short verifier run still succeeds
- multimodel candidate selection: rank parallel model outputs by syntax, verification, size, and verification time
Automated Lemma Discovery in Agentic Program Verification
- semantic versus proof-targeted VCs β derive an agent-readable source-level obligation but prove the actual generated VC through the trusted verifier
- offline obligation-aligned lemma synthesis β compare both VC representations and emit machine-checked helper lemmas plus an application plan
- verified dynamic lemma library β retain only compiled lemmas and their dependencies for retrieval during later proof states
- feedback-guided lemma adaptation β refine types, definitions, or statements from proof-assistant errors, then prove each refinement separately
- helper-role taxonomy β classify lemmas as bridge, reduce, rewrite, or strengthen to guide retrieval and measure utility
- program slicing for semantic analysis β send only code/specification portions relevant to the target obligation to control context size
- ablation-based proof-agent evaluation β disable offline, online, or semantic-analysis components and compare denominatored VC success
- trust-boundary preservation β keep the LLM outside the trusted base by importing no statement that the proof assistant has not checked
Agentic Proving for Program Verification
- staged specification certification β generate a contract, then separately prove its relation to a reference while classifying mismatches and defects
- implementation certification β generate executable code under a fixed contract and prove the top-level correctness theorem
- issue-aware agent diagnosis β require counterexamples and component-level classifications for failures instead of binary pass/fail
- guided multi-interpretation synthesis β use examples, boundary policies, and multiple candidate contracts to expose ambiguity
A Complete, Formal Semantics for Rust Source Code
- four-layer LAGC construction β separate local evaluation, trace well-formedness, global trace composition, and initial/final program semantics
- symbolic trace concretization β use symbolic states and events locally, then concretize and chop them into shining traces under a well-formedness predicate
- context-sensitive
nextwith holes β compute the next sub-expression under value/place context and rebuild the enclosing expression through a single hole - modular Rust expression rules β model arithmetic overflow, references, assignments, calls, returns, loops, and panic as independent local rules with explicit events
- continuation-stack composition β compose local traces with call-stack rules and define finite maximal or infinite-limit program traces
- maximally permissive async semantics β represent futures, handles, await suspension, and arbitrary task selection as event-constrained task-stack transitions
- queue-and-tick Tokio model β add schedule events, local/global queues, ticks, and mutually exclusive composition rules for current-thread Tokio
- quiescent fairness by distance β prove that an enabled task executes or decreases a well-founded scheduling-distance measure at quiescent states
- bounded Tokio fairness β derive a finite scheduling bound from task-count and poll-time bounds
- trace-suffix soundness for dynamic logic β prove symbolic-execution calculus rules by showing transformed programsβ traces share a finite prefix and suffix
- loop-scope invariant proof β encode break/continue with a loop-scope flag and use anonymizing updates plus induction to preserve invariants
ANCORA: Learning to Question via Manifold-Anchored Self-Play
- manifold-first verified SFT β bootstrap format/proof coverage by distilling only Verus-verified rollouts before RL
- MLRL mean-normalized GRPO β weight rare successful attempts by inverse success count using centered binary rewards
- frontier-targeting proposer reward β reward specs whose solver outcomes are hard but nonzero, especially exactly one success in K
- solved-only UCB curriculum DAG β compose novel specs as seeds only after verifier success, novelty, and vacuity gates
Advancing Mathematics Research with AI-Driven Formal Proof Search
- compiler-gated proof loop β alternate LLM edits with Lean/Verus compilation and accept only hole-free proofs
- independent Ralph episodes β run stateless multi-turn subagents and carry forward compile-checked sketches
- helper-lemma decomposition β split monolithic goals into smaller lemmas and recheck every nested proof
- specialized prover calls β invoke a stronger proof engine on one subgoal and feed failures back to the loop
- evolutionary sketch population β rank validated candidates with ratings and sample them using P-UCB search
- formalization test lemmas β prove finite sanity cases before attempting autoformalized conjectures
- parameter-and-proof search β expose construction values for joint synthesis while protecting the theorem
- protected statement validation β prevent agents from changing specifications and reject residual placeholders
- failure-artifact collaboration β retain unresolved formal goals as precise inputs for human reformulation
Last edited: