Reference. Formal verification of a realistic compiler
Cite
Cited by (23)
Cobblestone: A Divide-and-Conquer Approach for Automating Formal Verification kasibatla-2026-cobblestone
Relational Separation Logic for Compiler Verification leroy_pottier_relsep_2026
Scaling Instruction-Selection Verification against Authoritative ISA Semantics mcloughlin-2025-scaling
From Linearity to Borrowing wagner-2025-from
Intrinsic Verification of Parsers and Formal Grammar Theory in Dependent Lambek Calculus intrinsic-verification-of-parsers
We present Dependent Lambek Calculus (Lambek), a domain-specific dependent type theory for verified parsing and formal grammar theory. In Lambek, linear types are used as a syntax for formal grammars, and parsers can be written as linear terms. The linear typing restriction provides a form of intrinsic verification that a parser yields only valid parse trees for the input string. We demonstrate the expressivity of this system by showing that the combination of inductive linear types and dependency on non-linear data can be used to encode commonly used grammar formalisms such as regular and context-free grammars as well as traces of various types of automata. Using these encodings, we define parsers for regular expressions using deterministic automata, as well as examples of verified parsers of context-free grammars.
We present a denotational semantics of our type theory that interprets the linear types as functions from strings to sets of abstract parse trees and terms as parse transformers. Based on this denotational semantics, we have made a prototype implementation of Lambek using a shallow embedding in the Agda proof assistant. All of our examples parsers have been implemented in this prototype implementation.
QEDCartographer: Automating Formal Verification Using Reward-Free Reinforcement Learning sanchezstern-2025-qedcartographer
The Denotational Semantics of SSA ghalayini-2024-the
Verus: A Practical Foundation for Systems Verification lattuada-2024-verus
FlowCert: Translation Validation for Asynchronous Dataflow via Dynamic Fractional Permissions lin-2024-flowcert
Correctly Compiling Proofs About Programs Without Proving Compilers Correct seo-2024-correctly
Baldur: Whole-Proof Generation and Repair with Large Language Models first-2023-baldur
Passport: Improving Automated Formal Verification Using Identifiers sanchezstern-2023-passport
PRoofster: Automated Formal Verification agrawal-2023-proofster
Formalized High Level Synthesis with Applications to Cryptographic Hardware harrison-2023-formalized
Simuliris: A Separation Logic Framework for Verifying Concurrent Program Optimizations gaher_etal_simuliris_2022
Today’s compilers employ a variety of non-trivial optimizations to achieve good performance. One key trick compilers use to justify transformations of concurrent programs is to assume that the source program has no data races: if it does, they cause the program to have undefined behavior (UB) and give the compiler free rein. However, verifying correctness of optimizations that exploit this assumption is a non-trivial problem. In particular, prior work either has not proven that such optimizations preserve program termination (particularly non-obvious when considering optimizations that move instructions out of loop bodies), or has treated all synchronization operations as external functions (losing the ability to reorder instructions around them).
In this work we present Simuliris, the first simulation technique to establish termination preservation (under a fair scheduler) for a range of concurrent program transformations that exploit UB in the source language. Simuliris is based on the idea of using ownership to reason modularly about the assumptions the compiler makes about programs with well-defined behavior. This brings the benefits of concurrent separation logics to the space of verifying program transformations: we can combine powerful reasoning techniques such as framing and coinduction to perform thread-local proofs of non-trivial concurrent program optimizations. Simuliris is built on a (non-step-indexed) variant of the Coq-based Iris framework, and is thus not tied to a particular language. In addition to demonstrating the effectiveness of Simuliris on standard compiler optimizations involving data race UB, we also instantiate it with Jung et al.’s Stacked Borrows semantics for Rust and generalize their proofs of interesting type-based aliasing optimizations to account for concurrency.
Compositional optimizations for CertiCoq paraskevopoulou-2021-compositional
Zippy LL(1) parsing with derivatives EdelmannZippy2020
QED at Large: A Survey of Engineering of Formally Verified Software ringer-2019-qed
Ivy: Safety verification by interactive generalization padonIvySafetyVerification
CakeML: A verified implementation of ML kumar_cakeml_2014
Safely Composable Type-Specific Languages omar-2014-safely
Validating LR(1) Parsers jourdanValidatingLRParsers2012
Finding and Understanding Bugs in C Compilers yangFindingUnderstandingBugs
Cites 23 works (0 here)
External (23)
- Mechanized semantics for the Clight subset of the C language (2009)
- Verified validation of lazy code motion (2009)
- A formally verified compiler back-end (2009)
- Formal Verification of a C-like Memory Model and Its Uses for Verifying Program Transformations (2008)
- Extraction in Coq: An Overview (2008)
- Formal verification of translation validators (2008)
- The CompCert verified compiler, software and commented proof (2008)
- Separation logic for small-step Cminor (2007)
- Formal Verification of a C Compiler Front-End (2006)
- Formal certification of a compiler back-end, or: programming a compiler with a proof assistant (2006)
- Interactive Theorem Proving and Program Development—Coq'Art: The Calculus of Inductive Constructions (2004)
- Compiler verification (2003)
- CIL: Intermediate language and tools for analysis and transformation of C programs (2002)
- Foundational proof-carrying code (2001)
- Translation validation for an optimizing compiler (2000)
- From system F to typed assembly language (1999)
- Translation validation (1998)
- Proof-carrying code (1997)
- Iterated register coalescing (1996)
- The Coq proof assistant (1989)
- Register allocation & spilling via graph coloring (1982)
- Proving compiler correctness in a mechanized logic (1972)
- Correctness of a compiler for arithmetic expressions (1967)