Reference. FlowCert: Translation Validation for Asynchronous Dataflow via Dynamic Fractional Permissions
Coarse-grained reconfigurable arrays (CGRAs) have gained attention in recent years due to their promising power efficiency compared to traditional von Neumann architectures. To program these architectures using ordinary languages such as C, a dataflow compiler must transform the original sequential, imperative program into an equivalent dataflow graph, composed of dataflow operators running in parallel. This transformation is challenging since the asynchronous nature of dataflow graphs allows out-of-order execution of operators, leading to behaviors not present in the original imperative programs. Weaddress this challenge by developing a translation validation technique for dataflow compilers to ensure that the dataflow program has the same behavior as the original imperative program on all possible inputs and schedules of execution. We apply this method to a state-of-the-art dataflow compiler targeting the RipTide CGRAarchitecture. Our tool uncovers 8 compiler bugs where the compiler outputs incorrect dataflow graphs, including a data race that is otherwise hard to discover via testing. After repairing these bugs, our tool verifies the correct compilation of all programs in the RipTide benchmark suite.
Cite
Cites 55 works (2 here)
With notes (2)
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.
Formal verification of a realistic compiler leroy_formal_2009
This paper reports on the development and formal verification (proof of semantic preservation) of CompCert, a compiler from Clight (a large subset of the C programming language) to PowerPC assembly code, using the Coq proof assistant both for programming the compiler and for proving its correctness. Such a verified compiler is useful in the context of critical software and its formal verification: the verification of the compiler guarantees that the safety properties proved on the source code hold for the executable compiled code as well.
External (53)
- Basic implementations of standard cryptography algorithms (2024)
- FlowCert GitHub repository (2024)
- Translation validation for asynchronous dataflow via dynamic fractional permissions (artifact) (2024)
- Clang: a C language family frontend for LLVM (2024)
- LLVM language reference manual (2024)
- Pipestitch: An energy-minimal dataflow architecture with lightweight threads (2023)
- A programmable, energy-minimal dataflow compiler and architecture (2022)
- Snafu: An Ultra-Low-Power, Energy-Minimal CGRA-Generation Framework and Architecture (2021)
- Language-parametric compiler validation with application to LLVM (2021)
- Alive2: bounded translation validation for LLVM (2021)
- Ground confluence of order-sorted conditional specifications modulo axioms (2020)
- Inductive sequentialization of asynchronous programs (2020)
- A Survey of Coarse-Grained Reconfigurable Architecture and Design (2019)
- Pretend synchrony: synchronous verification of asynchronous distributed programs (2019)
- A Survey of Symbolic Execution Techniques (2018)
- Verifying distributed programs via canonical sequentialization (2017)
- A formally verified compiler for Lustre (2017)
- Viper: a verification infrastructure for permission-based reasoning (2016)
- The Kind 2 Model Checker (2016)
- Iris (2015)
- Provably Correct Peephole Optimizations with Alive (2015)
- Hybrid Dataflow/von-Neumann Architectures (2014)
- Fractional Permissions (2013)
- Data-driven equivalence checking (2013)
- Denotational translation validation (2012)
- Evaluating value-graph translation validation for LLVM (2011)
- Proving optimizations correct using parameterized program equivalence (2009)
- Equality saturation: a new approach to optimization (2009)
- Z3: An Efficient SMT Solver (2008)
- Scaling Up the Formal Verification of Lustre Programs with SMT-Based Techniques (2008)
- Variables as Resource for Shared-Memory Programs: Semantics and Soundness (2006)
- Termination proofs for systems code (2006)
- Advances in dataflow programming languages (2004)
- LLVM: a compilation framework for lifelong program analysis & transformation (2004)
- WaveScalar (2003)
- Maude: specification and programming in rewriting logic (2002)
- Paxos made simple (2001)
- The π-calculus: a theory of mobile processes (2001)
- PipeRench: A Reconfigurable Architecture and Compiler (2000)
- Translation validation for an optimizing compiler (2000)
- Communicating and mobile systems: the π-calculus (1999)
- Term rewriting and all that (1998)
- XEVE, an ESTEREL Verification Environment (1998)
- Translation Validation (1998)
- The theory and practice of concurrency (1997)
- Types for Dyadic Interaction (1993)
- Synchronous data flow (1987)
- Dataflow architectures (1986)
- Data flow languages (1982)
- A preliminary architecture for a basic data-flow processor (1974)
- The semantics of a simple language for parallel programming (1974)
- Simple word problems in universal algebras (1970)
- Properties of a model for parallel computations: determinacy (1966)