Newer
Older

[Frama-C](https://frama-c.com) is a platform dedicated to the analysis of
source code written in C.
## A Collaborative Platform
Frama-C gathers several analysis techniques in a single collaborative
platform, consisting of a **kernel** providing a core set of features
(e.g., a normalized AST for C programs) plus a set of analyzers,
called **plug-ins**. Plug-ins can build upon results computed by other
plug-ins in the platform.
Thanks to this approach, Frama-C provides sophisticated tools, including:
- an analyzer based on abstract interpretation, aimed at verifying
the absence of run-time errors (**Eva**);
- a program proof framework based on weakest precondition calculus (**WP**);
- a program slicer (**Slicing**);
- a tool for verification of temporal (LTL) properties (**Aoraï**);
- a runtime verification tool (**E-ACSL**);
- several tools for code base exploration and dependency analysis
(**From**, **Impact**, **Metrics**, **Occurrence**, **Scope**, etc.).
These plug-ins share a common language and can exchange information via
**[ACSL](https://frama-c.com/acsl.html)** (*ANSI/ISO C Specification Language*)
properties. Plug-ins can also collaborate via their APIs.
## Installation
Frama-C is available through [opam](https://opam.ocaml.org/), the
OCaml package manager. If you have it, simply run:
opam install frama-c
or, for `opam` versions less than 2.1.0:
opam install depext # handles external (non-OCaml) dependencies
opam depext frama-c --install
Frama-C is developed mainly in Linux, often tested in macOS
(via Homebrew), and occasionally tested on Windows
(via the Windows Subsystem for Linux).
For detailed installation instructions and troubleshooting,
see [INSTALL.md](INSTALL.md).
### Development branch
To install the development branch of Frama-C (updated nightly):
This command will *pin* the development version of Frama-C and try to install it.
If installation fails due to missing external dependencies, try using
the same commands from the [Installation](#installation) section to get the
external dependencies and then install Frama-C.
### Distribution packages
Some Linux distributions have a `frama-c` package, kindly provided by
distribution packagers. Note that they may not correspond to the latest
Frama-C release.
## Usage
Frama-C can be run from the command-line, or via its graphical interface.
#### Simple usage
The recommended usage for simple files is one of the following lines:
frama-c file.c -<plugin> [options]
frama-c-gui file.c
Where `-<plugin>` is one of the several Frama-C plug-ins,
e.g. `-eva`, or `-wp`, or `-metrics`, etc.
Plug-ins can also be run directly from the GUI.
To list all plug-ins, run:
frama-c -plugins
Each plug-in has a help command
(`-<plugin>-help` or `-<plugin>-h`) that describes its own
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
options.
Finally, the list of options governing the behavior of Frama-C's kernel itself
is available through
frama-c -kernel-help
#### Complex scenarios
For more complex usage scenarios (lots of files and directories,
with several preprocessing directives), we recommend splitting Frama-C's usage
in two parts:
1. Parsing the input files and saving the result to a file;
2. Loading the parsing results and then running the analyses or the GUI.
Parsing typically involves giving extra arguments to the C preprocessor,
so the `-cpp-extra-args` option is often useful, as in the example below:
frama-c *.c *.h -cpp-extra-args="-D<define> -I<include>" -save parsed.sav
The results are then loaded into Frama-C for further analyses or for inspection
via the GUI:
frama-c -load parsed.sav -<plugin> [options]
frama-c-gui -load parsed.sav -<plugin> [options]
## Further reference
- Links to user and developer manuals, Frama-C archives,
and plug-in manuals are available at <br> https://frama-c.com/html/get-frama-c.html
- The [Frama-C documentation page](https://frama-c.com/html/documentation.html)
contains links to all manuals and plugins description, as well as tutorials,
courses and more.
- [StackOverflow](https://stackoverflow.com/questions/tagged/frama-c) has several
questions with the `frama-c` tag, which is monitored by several members of the
Frama-C community.
- The [Frama-c-discuss mailing list](https://groupes.renater.fr/sympa/info/frama-c-discuss)
is used for announcements and general discussions.
- The [Frama-C blog](https://frama-c.com/blog) has several posts about
new developments of Frama-C, as well as general discussions about the C
language, undefined behavior, floating-point computations, etc.
- The [Frama-C public repository](https://git.frama-c.com/pub/frama-c)
contains a daily snapshot of the development version of Frama-C, as well as
the [issues tracking system](https://git.frama-c.com/pub/frama-c/issues),
for reporting bugs.
These [contribution guidelines](CONTRIBUTING.md) detail how to submit
issues or create merge requests.