Duet is a static analysis tool designed for analyzing concurrent programs.
Duet depends on several software packages. The following dependencies need to be installed manually.
On Ubuntu, you can install these packages (except Java and MathSAT) with:
sudo apt-get install opam libgmp-dev libmpfr-dev
On MacOS, you can install these packages (except Java and MathSAT) with:
brew install opam gmp mpfr
Next, add the sv-opam OPAM repository, and install the rest of duet's dependencies. These are built from source, so grab a coffee — this may take a long time.
opam remote add sv git://github.com/zkincaid/sv-opam.git
opam install ocamlgraph batteries cil oasis ppx_deriving Z3 apron ounit menhir mathsat OCRS
After Duet's dependencies are installed, it can be built as follows:
./configure
make
Duet's makefile has the following targets:
make: Build duetmake ark: Build the ark library and test suitemake apak: Build the apak library and test suitemake doc: Build documentationmake test: Run test suite
There are three main program analyses implemented in Duet:
- Data flow graphs:
duet.native -coarsen FILE - Proof spaces:
duet.native -proofspace FILE - Compositional recurrence analysis:
duet.native -cra FILE
Duet supports two file types (and guesses which to use by file extension): C programs (.c), Boolean programs (.bp).
By default, Duet checks user-defined assertions, which are specified by the built-in function __VERIFIER_assert. Alternatively, it can also instrument assertions as follows:
duet.native -check-array-bounds -check-null-deref -coarsen FILE
The -coarsen flag implements an invariant generation procedure for multi-threaded programs with an unbounded number of threads. The analysis is described in
- Azadeh Farzan and Zachary Kincaid: Verification of Parameterized Concurrent Programs By Modular Reasoning about Data and Control. POPL 2012.
The -proofspace flag implements a software model checking procedure for multi-threaded programs with an unbounded number of threads. The procedure is described in
- Azadeh Farzan, Zachary Kincaid, Andreas Podelski: Proof Spaces for Unbounded Parallelism. POPL 2015.
The -cra flags an invariant generation procedure for sequential programs. The analysis is described in
- Azadeh Farzan and Zachary Kincaid: Compositional Recurrence Analysis. FMCAD 2015.
Typically, it is best to run CRA with -cra-split-loops and -cra-forward-inv. Experimental non-linear invariant generation is available using -cra-matrix.
The interprocedural variant is described in
- Zachary Kincaid, Jason Breck, Ashkan Forouhi Boroujeni, Thomas Reps: Compositional Recurrence Analysis Revisited. PLDI 2017.
is available in the Newton-ark2 branch of this repository. Build instructions to come.
Duet is split into several packages:
-
apak
Algebraic program analysis kit. This is a collection of utilities for implementing program analyzers. It contains various graph algorithms (e.g., fixpoint computation, path expression algorithms) and utilities for constructing algebraic structures.
-
ark
Arithmetic reasoning kit. This is a high-level interface over Z3, MathSAT and Apron. Most of the work of compositional recurrence analysis lives in ark.
-
pa
Predicate automata library.
-
duet
Implements program analyses, frontends, and anything programming-language specific.