Es gibt keine Möglichkeit, absolut sicher zu sein, dass verschiedene Arten von undefiniertem Verhalten (insbesondere Rennbedingungen) nicht existieren.
Es gibt jedoch eine Reihe von Tools, die eine gute Anzahl solcher Situationen aufzeigen. Möglicherweise können Sie nachweisen, dass derzeit ein Problem mit solchen Tools vorliegt, obwohl Sie nicht nachweisen können, dass Ihr Fix gültig ist.
Einige interessante Tools für diesen Zweck:
Valgrind ist ein Gedächtnisprüfer. Es findet Speicherlecks, liest nicht initialisierten Speicher, verwendet baumelnde Zeiger und grenzüberschreitende Zugriffe.
Helgrind ist ein Fadensicherheitsprüfer. Es findet Rennbedingungen.
Beide arbeiten mit dynamischer Instrumentierung, dh sie nehmen Ihr Programm wie es ist und führen es in einer virtualisierten Umgebung aus. Das macht sie unaufdringlich, aber langsam.
UBSan ist ein undefinierter Verhaltensüberprüfer. Es werden verschiedene Fälle von undefiniertem Verhalten in C und C ++ gefunden, z. B. Integer-Überläufe, Verschiebungen außerhalb des Bereichs und ähnliches.
MSan ist ein Speicher-Checker. Es hat ähnliche Ziele wie Valgrind.
TSan ist ein Thread-Sicherheitsprüfer. Es hat ähnliche Ziele wie Helgrind.
Diese drei Funktionen sind in den Clang-Compiler integriert und generieren beim Kompilieren Code. Dies bedeutet, dass Sie sie in Ihren Erstellungsprozess integrieren müssen (insbesondere müssen Sie sie mit Clang kompilieren). Dies macht sie anfangs viel schwieriger einzurichten als * grind, hat aber andererseits einen viel geringeren Laufzeitaufwand.
Alle aufgelisteten Tools funktionieren unter Linux und einige unter MacOS. Ich denke noch keine Arbeit an Windows zuverlässig.