ACSL (ANSI/ISO C Specification Language) ist eine formale Spezifikationssprache für C-Programme, entwickelt im Frama-C-Projekt. Ihr Design ist von JML (Java Modeling Language) inspiriert und erbt viel von Caduceus, einem früheren Analysewerkzeug. Mit ACSL beschreibt man das Verhalten von C-Funktionen präzise — als Verträge mit Vorbedingung, Nachbedingung und Frame-Regel — und lässt diese Eigenschaften anschließend maschinell beweisen.
Syntax: Annotationen als Kommentare
/*@ requires n >= 0;
@ ensures
esult == n * (n + 1) / 2;
@ assigns
othing;
@*/
int summe(int n) {
int s = 0;
/*@ loop invariant 0 <= i <= n && s == i * (i - 1) / 2;
@ loop assigns s, i;
@ loop variant n - i;
@*/
for (int i = 1; i <= n; i++) s += i;
return s;
}
Wichtige Konstrukte
requires— Vorbedingung (Precondition), die der Aufrufer garantieren muss.ensures— Nachbedingung (Postcondition), die die Funktion garantiert.assigns— Frame-Regel: welche Speicherbereiche die Funktion verändern darf.loop invariant/loop variant— Schleifeninvariante und Terminierungsargument.
Logische Terme
ACSL stellt spezielle Terme bereit:
esult (Rückgabewert), old(ausdruck) (Wert vor dem Funktionsaufruf), valid(zeiger) (gültiger Speicherbereich), valid_range, length,
othing (leere Frame-Regel),
ull, rue/false.
Einordnung
ACSL wird von den Frama-C-Plugins verarbeitet: WP (Weakest Precondition) erzeugt Beweisverpflichtungen, die Why3 an Beweiser wie Alt-Ergo oder Z3 delegiert; EVA analysiert mit abstrakter Interpretation; E-ACSL übersetzt Annotationen in Laufzeitprüfungen. Damit steht ACSL in einer Reihe mit anderen formalen Spezifikationssprachen: VDM und Z-Notation spezifizieren auf höherer Ebene, HOL-Assistenten können die erzeugten Verpflichtungen interaktiv beweisen.
Verwandte Grundlagen: Frama-C-Befehle, Why3-Befehle, C/C++-Befehle.