Cerberus C semantics
See the codeSee https://www.cl.cam.ac.uk/~pes20/cerberus/.
To build Cerberus, you need opam (>= 2.0.0, see here to install) and OCaml (>= 4.12.0).
First install the dependencies (including lem and menhir) using opam:
$ opam install --deps-only ./cerberus-lib.opam ./cerberus.opam
Then build the CLI using:
$ make
The CLI can then be used either from the source directory using:
$ dune exec cerberus -- ARG1 .. ARGN
or, after doing $ make install, using the cerberus executable.
To fully remove all object and Lem generated files:
$ make distclean
To remove the object files, but keep the Lem generated files (allowing for faster build when only working on .ml files):
$ make clean
$ cerberus --exec file1.c ... fileN.c
This will elaborate to Core, link, look for a main() function, and start executing the Core from there. To see a printout of the return value, and to get a machine-friendly collection of stdout and stderr,
add the --batch argument.
$ cerberus --args="arg1","arg2" file.c
The C abstract syntax (Cabs) and the Ail intermediate representation can be printed with --ast=cabs and --ast=ail.
The Ail intermediate representation and the Core program can be pretty-printed with --pp=ail and --pp=core.
$ cerberus file1.c ... fileN.c
This will elaborate the C translation units to Core programs, and link them, before returning silently.
Include directories can be added with the usual -I, and macros can be forwarded to the preprocessor using -D (and unset with -U).
For more, see cerberus --help
Various C programs can be found in tests/.
Install the common dependencies and the following extra ones:
$ opam install angstrom
Then run:
$ make cerberus-bmc
To run:
$ cerberus-bmc --help
Install the common dependencies and some backend specific ones (see here for details):
$ opam install --deps-only ./cerberus-web.opam ./cerberus-lib.opam
Then:
$ make web
This copies all the available web instances as webcerb.* and the web server as cerberus-webserver to the source root directory.
Next, build the webapp providing the UI (this requires the node package manager npm):
$ make ui
The first command sets up a deployment directory at public/_deployment containing a default configuration config.json.
To run the server with that default configuration:
$ ./cerberus-webserver -c public/_deployment/config.json
(If you intend to move and run the server binary to another location, you will need the cerberus-lib package to first be installed in with opam)
You can also compile all the targets with:
$ make all
For a local build, run:
$ docker build -t cerberus:release -f Dockerfile.ubuntu .
which creates a Docker image than can be used for example with:
$ docker run --volume `PWD`:/data/ cerberus:release cerberus tests/tcc/00_assignment.c --pp=core
This image contains all the source code.
Contributors:
The main Cerberus developer is Kayvan Memarian. Victor Gomes made substantial contributions across the system. Kyndylan Nienhuis worked on the operational semantics for C11 concurrency. Stella Lau is the main developer of Cerberus BMC. The CN backend is by Christopher Pulte and Thomas Sewell. The CHERI memory model is by Vadim Zaliva. Cerberus originated with Justus Matthiesen's 2010-11 Part II project dissertation and his 2011-12 MPhil dissertation. James Lingard's 2013-14 MPhil dissertation developed a certifying translation validator for simple C programs for the Clang front-end, w.r.t. the Cerberus and Vellvm semantics.
This software was developed largely within the Rigorous Engineering of Mainstream Systems (REMS) project at the University of Cambridge. It has received funding from the European Research Council (ERC) under the European Union's Horizon 2020 research and innovation programme (grant agreement No 789108, ELVER); the EPSRC Programme Grant REMS: Rigorous Engineering of Mainstream Systems (EP/K008528/1); an EPSRC Leadership Fellowship EP/H005633 (Sewell); a Gates Cambridge Scholarship (Nienhuis); an MIT EECS Graduate Alumni Fellowship (Lau); and Google.
(top 30 of 37)
OCaml
42.6%
HTML
32.2%
Rocq Prover
13.0%
Isabelle
7.2%
C
1.5%
TypeScript
1.2%
Cerberus C semantics
See the codeSee https://www.cl.cam.ac.uk/~pes20/cerberus/.
To build Cerberus, you need opam (>= 2.0.0, see here to install) and OCaml (>= 4.12.0).
First install the dependencies (including lem and menhir) using opam:
$ opam install --deps-only ./cerberus-lib.opam ./cerberus.opam
Then build the CLI using:
$ make
The CLI can then be used either from the source directory using:
$ dune exec cerberus -- ARG1 .. ARGN
or, after doing $ make install, using the cerberus executable.
To fully remove all object and Lem generated files:
$ make distclean
To remove the object files, but keep the Lem generated files (allowing for faster build when only working on .ml files):
$ make clean
$ cerberus --exec file1.c ... fileN.c
This will elaborate to Core, link, look for a main() function, and start executing the Core from there. To see a printout of the return value, and to get a machine-friendly collection of stdout and stderr,
add the --batch argument.
$ cerberus --args="arg1","arg2" file.c
The C abstract syntax (Cabs) and the Ail intermediate representation can be printed with --ast=cabs and --ast=ail.
The Ail intermediate representation and the Core program can be pretty-printed with --pp=ail and --pp=core.
$ cerberus file1.c ... fileN.c
This will elaborate the C translation units to Core programs, and link them, before returning silently.
Include directories can be added with the usual -I, and macros can be forwarded to the preprocessor using -D (and unset with -U).
For more, see cerberus --help
Various C programs can be found in tests/.
Install the common dependencies and the following extra ones:
$ opam install angstrom
Then run:
$ make cerberus-bmc
To run:
$ cerberus-bmc --help
Install the common dependencies and some backend specific ones (see here for details):
$ opam install --deps-only ./cerberus-web.opam ./cerberus-lib.opam
Then:
$ make web
This copies all the available web instances as webcerb.* and the web server as cerberus-webserver to the source root directory.
Next, build the webapp providing the UI (this requires the node package manager npm):
$ make ui
The first command sets up a deployment directory at public/_deployment containing a default configuration config.json.
To run the server with that default configuration:
$ ./cerberus-webserver -c public/_deployment/config.json
(If you intend to move and run the server binary to another location, you will need the cerberus-lib package to first be installed in with opam)
You can also compile all the targets with:
$ make all
For a local build, run:
$ docker build -t cerberus:release -f Dockerfile.ubuntu .
which creates a Docker image than can be used for example with:
$ docker run --volume `PWD`:/data/ cerberus:release cerberus tests/tcc/00_assignment.c --pp=core
This image contains all the source code.
Contributors:
The main Cerberus developer is Kayvan Memarian. Victor Gomes made substantial contributions across the system. Kyndylan Nienhuis worked on the operational semantics for C11 concurrency. Stella Lau is the main developer of Cerberus BMC. The CN backend is by Christopher Pulte and Thomas Sewell. The CHERI memory model is by Vadim Zaliva. Cerberus originated with Justus Matthiesen's 2010-11 Part II project dissertation and his 2011-12 MPhil dissertation. James Lingard's 2013-14 MPhil dissertation developed a certifying translation validator for simple C programs for the Clang front-end, w.r.t. the Cerberus and Vellvm semantics.
This software was developed largely within the Rigorous Engineering of Mainstream Systems (REMS) project at the University of Cambridge. It has received funding from the European Research Council (ERC) under the European Union's Horizon 2020 research and innovation programme (grant agreement No 789108, ELVER); the EPSRC Programme Grant REMS: Rigorous Engineering of Mainstream Systems (EP/K008528/1); an EPSRC Leadership Fellowship EP/H005633 (Sewell); a Gates Cambridge Scholarship (Nienhuis); an MIT EECS Graduate Alumni Fellowship (Lau); and Google.
(top 30 of 37)
OCaml
42.6%
HTML
32.2%
Rocq Prover
13.0%
Isabelle
7.2%
C
1.5%
TypeScript
1.2%