Dedlock est un analyseur statique pour la détection de blocages potentiels dans les programmes C mis en œuvre en tant que plugin de la plate-forme FRAMA-C.
L'algorithme de base est basé sur un outil existant Racex. L'analyse dite de l'ensemble de verrouillage traverse le graphique de flux de contrôle et calcule l'ensemble des verrous tenus à n'importe quel point de programme. Lorsque le verrouillage B est acquis avec un ensemble de verrouillage actuel contenant déjà le verrouillage A, la dépendance A -> B est ajoutée à Lockgraph. Chaque cycle de ce graphique est ensuite signalé comme une impasse potentielle.
Le plugin utilise EVA (Plugin d'analyse de valeur de FraM-C) pour calculer les informations de ma mai pour les paramètres des opérations de verrouillage. Parce que EVA ne peut pas analyser nativement les programmes simultanés, nous identifions d'abord tous les threads d'un programme, puis l'exécutons pour chaque thread séparément avec des contextes de points de programme, où le thread a été créé. Le résultat est ensuite sous-approximatif, qui ne prend pas en compte les entrelacés du thread.
Cet exemple démontre la sortie du programme avec une impasse simple. L'exemple le plus complexe peut être trouvé ici.
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)
La version actuelle est compatible avec Frara-C Vanadium, son guide d'installation détaillé peut être trouvé dans le manuel d'utilisation et nécessite une version OCAML au moins 4.12. Outre Frame-C, l'impasse nécessite l'installation de packages OPAM:
ounit2
containers
Après avoir installé des dépendances et clonage ce réprimande, l'impasse peut être installée comme suit:
cd Deadlock
make setup
make
make install
Vous pouvez également exécuter une impasse dans Docker soit en utilisant docker run -it tdacik/deadlock , soit en exécutant make docker pour créer une image de la version la plus récente.
La façon la plus simple d'exécuter le plugin est:
frama-c -deadlock source_file1.c source_file2.c ...
Pour une utilisation plus avancée, consultez la liste des options de ligne de commande pour régler le manuel de l'analyse et de l'interface graphique pour la visualisation des résultats dans l'application GUI de Frame-C.
Dacík T. Détection statique de l'impasse statique dans Frame-C dans les actes d'Excel @ fit'20 . BRNO University of Technology, Faculté de technologie de l'information. 2020
L'analyse statique de Dacík T. dans l'environnement de frama-C s'est concentrée sur la thèse du baccalauréat de la détection de blocage. BRNO University of Technology, Faculté de technologie de l'information. 2020-07-10. Supervisé par Vojnar Tomáš.
Si vous avez des questions, n'hésitez pas à contacter les auteurs de l'outil / méthode:
Le plugin est disponible sous licence MIT.