Deadlock ist ein statischer Analysator zur Erkennung potenzieller Deadlocks in C-Programmen, die als Plugin der Frama-C-Plattform implementiert sind.
Der Kernalgorithmus basiert auf einem vorhandenen Tool Racerx. Die sogenannte Lockset-Analyse durchquert den Steuerflussdiagramm und berechnet den Satz von Schlössern an jedem Programmpunkt. Wenn die Sperre B mit einem aktuellen Schlosser erfasst wird, der bereits Sperre A enthält, wird die Abhängigkeit A -> B zum Sperren hinzugefügt. Jeder Zyklus in dieser Grafik wird dann als potenzieller Deadlock angegeben.
Das Plugin verwendet EVA (Value Analysis Plugin von Frama-C), um Mai-Point-to-Informationen für Parameter der Verriegelungsvorgänge zu berechnen. Da EVA nicht gleichzeitige Programme nativ analysieren kann, identifizieren wir zuerst alle Threads in einem Programm und führen sie dann für jeden Thread getrennt mit Kontexten von Programmpunkten aus, in denen der Thread erstellt wurde. Das Ergebnis ist dann Unterabnahmeregelung, was die Einschüsse des Threads nicht berücksichtigt.
Dieses Beispiel zeigt die Ausgabe für das Programm mit einfachem Deadlock. Das komplexere Beispiel finden Sie hier.
void * thread1 ( void * v )
{
pthread_mutex_lock ( & lock1 );
pthread_mutex_lock ( & lock2 );
...
pthread_mutex_unlock ( & lock2 );
pthread_mutex_unlock ( & lock1 );
}
void * thread2 ( void * v )
{
pthread_mutex_lock ( & lock2 );
pthread_mutex_lock ( & lock1 );
...
pthread_mutex_unlock ( & lock1 );
pthread_mutex_unlock ( & lock2 );
} [kernel] Parsing simple_deadlock.c (with preprocessing)
[Deadlock] Deadlock analysis started
[Deadlock] === Assumed threads: ===
[Deadlock] main
[Deadlock] thread1
[Deadlock] thread2
[Deadlock] === Lockgraph: ===
[Deadlock] lock1 -> lock2
[Deadlock] lock2 -> lock1
[Deadlock] ==== Results: ====
[Deadlock] Deadlock between threads thread1 and thread2:
Trace of dependency (lock2 -> lock1):
In thread thread2:
Lock of lock2 (simple_deadlock.c:20)
Lock of lock1 (simple_deadlock.c:21)
Trace of dependency (lock1 -> lock2):
In thread thread1:
Lock of lock1 (simple_deadlock.c:10)
Lock of lock2 (simple_deadlock.c:11)
Die aktuelle Version ist mit Frama-C Vanadium kompatibel. Der detaillierte Installationshandbuch finden Sie im Benutzerhandbuch und benötigen eine OCAML-Version mindestens 4.12. Neben Frama-C muss Deadlock die folgenden OPAM-Pakete installiert werden:
ounit2
containers
Nach der Installation von Abhängigkeiten und Klonen dieses Reponitärs kann Deadlock wie folgt installiert werden:
cd Deadlock
make setup
make
make install
Sie können auch Deadlock in Docker ausführen, entweder mit docker run -it tdacik/deadlock oder durch Laufen make docker um ein Bild der neuesten Version zu erstellen.
Der einfachste Weg, das Plugin auszuführen, ist:
frama-c -deadlock source_file1.c source_file2.c ...
Für fortgeschrittenere Nutzung finden Sie in Liste der Befehlszeilenoptionen zum Einstellen des Analyse- und GUI-Handbuchs zur Visualisierung der Ergebnisse in der GUI-Anwendung von Frama-C.
Dacík T. Statische Deadlock-Erkennung in Frama-C in Proceedings of Excel@fit'20 . BRNO Universität für Technologie, Fakultät für Informationstechnologie. 2020
Dacík T. Statische Analyse in der Frama-C-Umgebung, die sich auf die Bachelor-These des Bachelor-Deadlocks konzentriert. BRNO Universität für Technologie, Fakultät für Informationstechnologie. 2020-07-10. Aufsicht von Vojnar Tomáš.
Wenn Sie Fragen haben, wenden Sie sich nicht an die Werkzeug-/Methodenautoren:
Das Plugin ist unter MIT -Lizenz erhältlich.