Il n’ya aucun moyen d’être absolument sûr que différents types de comportement indéfini (dans des conditions de concurrence particulières) n’existent pas.
Cependant, il existe un certain nombre d’outils qui illustrent bon nombre de ces situations. Vous pourrez peut-être prouver qu'un problème existe actuellement avec de tels outils, même si vous ne pouvez pas prouver que votre correctif est valide.
Quelques outils intéressants à cet effet:
Valgrind est un vérificateur de mémoire. Il trouve les fuites de mémoire, les lectures de mémoire non initialisée, les utilisations de pointeurs en suspens et les accès hors limites.
Helgrind est un vérificateur de sécurité des threads. Il trouve des conditions de course.
Les deux fonctionnent par instrumentation dynamique, c'est-à-dire qu'ils prennent votre programme tel quel et l'exécutent dans un environnement virtualisé. Cela les rend peu intrusifs, mais lents.
UBSan est un vérificateur de comportement non défini. Il trouve divers cas de comportement indéfini en C et C ++, tels que des débordements d'entiers, des décalages hors de la plage, etc.
MSan est un vérificateur de mémoire. Il a des objectifs similaires à ceux de Valgrind.
TSan est un vérificateur de sécurité des threads. Ses objectifs sont similaires à ceux de Helgrind.
Ces trois éléments sont intégrés au compilateur Clang et génèrent du code au moment de la compilation. Cela signifie que vous devez les intégrer dans votre processus de construction (en particulier, vous devez compiler avec Clang), ce qui les rend beaucoup plus difficiles à configurer au départ que * grind, mais d'un autre côté, leur temps d'exécution est beaucoup moins important.
Tous les outils que j'ai énumérés fonctionnent sous Linux et certains sous MacOS. Je ne pense pas que tout fonctionne sur Windows de manière fiable pour le moment.