Existe-t-il une méthode ou un outil automatique permettant d'analyser le code C afin de déterminer si tous les appels de fonction initialisateur sont logiquement associés à un appel de fonction finalisateur correspondant dans la portée d'un bloc ?
Par initialisateur et finalisateur, j'entends une paire comme fopen()
y fclose()
.
Des modifications importantes ont été apportées à la question originale : L'expression "chemin de code" a été supprimée et les expressions "logiquement apparié" et "dans la portée d'un bloc" ont été ajoutées afin de clarifier l'intention initiale. Voir la discussion approfondie sous la réponse d'Eugene Sh. Par "logiquement apparié", je veux dire par opposition à "textuellement apparié", c'est-à-dire qu'il est sans importance que le texte du code source contienne un nombre égal d'appels à l'initialisateur et au finalisateur. Au contraire, lorsqu'on sort de la portée d'un bloc (si jamais), tout appel de fonction initialisateur est garanti avoir un appel de fonction finalisateur correspondant.
Exemples
Ok :
initialize();
mystery_function_that_may_never_return();
finalize();
Ok :
initialize();
if (cond)
finalize();
else
finalize();
Pas bien :
initialize();
initialize();
finalize();
Pas bien :
initialize();
finalize();
finalize();
Pas bien :
initialize();
if (cond)
finalize();
else
return;
Il pourrait également être judicieux de transférer la responsabilité de la finalisation/transfert de la "propriété" de la ressource gérée. Dans ce cas, le contrôle consisterait à vérifier que toutes les initialisations conduisent à une finalisation ou à un transfert de propriété.