Nie ma absolutnej pewności, że różne rodzaje nieokreślonych zachowań (w szczególności warunki wyścigowe) nie istnieją.
Istnieje jednak szereg narzędzi, które pokazują dużą liczbę takich sytuacji. Być może możesz udowodnić, że istnieje problem z takimi narzędziami, nawet jeśli nie możesz udowodnić, że poprawka jest poprawna.
Kilka interesujących narzędzi do tego celu:
Valgrind to narzędzie do sprawdzania pamięci. Znajduje wycieki pamięci, odczytuje niezainicjowaną pamięć, wykorzystuje zwisające wskaźniki i dostęp poza granicami.
Helgrind to narzędzie do sprawdzania bezpieczeństwa wątków. Znajduje warunki wyścigu.
Oba działają za pomocą dynamicznej instrumentacji, tzn. Biorą twój program w niezmienionej postaci i uruchamiają go w zwirtualizowanym środowisku. To sprawia, że są nieinwazyjne, ale powolne.
UBSan to niezdefiniowany moduł sprawdzania zachowania. Znajduje różne przypadki nieokreślonego zachowania C i C ++, takie jak przepełnienie liczb całkowitych, przesunięcia poza zasięgiem i podobne rzeczy.
MSan to kontroler pamięci. Ma podobne cele jak Valgrind.
TSan to narzędzie do sprawdzania bezpieczeństwa wątków. Ma podobne cele jak Helgrind.
Te trzy są wbudowane w kompilator Clanga i generują kod w czasie kompilacji. Oznacza to, że musisz zintegrować je z procesem kompilacji (w szczególności musisz skompilować z Clangiem), co znacznie utrudnia ich początkową konfigurację niż * grind, ale z drugiej strony mają znacznie niższy czas działania.
Wszystkie wymienione przeze mnie narzędzia działają w systemie Linux, a niektóre w systemie MacOS. Nie sądzę, aby jakakolwiek praca w systemie Windows była jeszcze niezawodna.