Frama-C ist eine Open-Source-Plattform zur Analyse von C-Quellcode; sie bündelt mehrere Analysetechniken in einem gemeinsamen Rahmenwerk. Die formale Spezifikationssprache heißt ACSL (ANSI/ISO C Specification Language), ausgewählte Plug-ins führen statische Analyse und Verifikation durch.

Aufruf von der Kommandozeile

frama-c -eva datei.c              # abstrakte Interpretation (Werte)
frama-c -wp datei.c               # Schwaechste-Vorbedingung, Beweis
frama-c -wp -wp-prover alt-ergo datei.c
frama-c -metrics datei.c          # Metriken
frama-c -gui datei.c              # graphische Oberflaeche (frama-c-gui)

Das EVA-Plug-in (ab 18.0; vorher VALUE) überapproximiert die möglichen Werte von Variablen an jedem Programmpunkt und findet so Laufzeitfehler wie Überläufe oder Zugriffe außerhalb von Feldgrenzen. Das WP-Plug-in implementiert einen Weakest-Precondition-Kalkül und erzeugt Verifikationsbedingungen (VCs), die an externe Beweiser wie Alt-Ergo, Z3 oder CVC4 gehen.

ACSL-Annotationen

/*@ requires 0 <= n && n < 100;
  @ ensures  
esult == n * n;
  @*/
int quadrat(int n) { return n * n; }
  • requires: Vorbedingung, ensures: Nachbedingung, assigns: erlaubte Seiteneffekte.
  • //@ assert p;: lokale Behauptung, //@ loop invariant: Schleifeninvariante.
  • esult, old(expr), valid(p), separated(...): Terme für Rückgabe, Alt-Werte, Zeiger-Gültigkeit.

Frama-C ergänzt die Beweisassistenten-Familie um eine C-spezifische, praktische Verifikation: verwandt sind VDM, PVS und SPIN/Promela; als C-Anker dient C/C++-Befehle.