Non c'è modo di essere assolutamente certi che non esistano vari tipi di comportamento indefinito (in particolari condizioni di razza).
Tuttavia, esistono numerosi strumenti che mostrano un buon numero di tali situazioni. Potresti essere in grado di dimostrare che esiste un problema attualmente con tali strumenti, anche se non puoi provare che la tua correzione sia valida.
Alcuni strumenti interessanti per questo scopo:
Valgrind è un controllore di memoria. Trova perdite di memoria, letture di memoria non inizializzata, usi di puntatori penzolanti e accessi fuori limite.
Helgrind è un controllore di sicurezza del thread. Trova le condizioni di gara.
Entrambi funzionano con strumenti dinamici, ovvero prendono il programma così com'è ed eseguono in un ambiente virtualizzato. Questo li rende poco invadenti, ma lenti.
UBSan è un controllo del comportamento indefinito. Trova vari casi di comportamento indefinito in C e C ++, come overflow di interi, spostamenti fuori range e cose simili.
MSan è un controllore di memoria. Ha obiettivi simili a quelli di Valgrind.
TSan è un controllo di sicurezza del thread. Ha obiettivi simili a quelli di Helgrind.
Questi tre sono integrati nel compilatore Clang e generano codice in fase di compilazione. Ciò significa che devi integrarli nel tuo processo di compilazione (in particolare, devi compilare con Clang), il che li rende molto più difficili da impostare inizialmente rispetto a * grind, ma d'altra parte hanno un tempo di esecuzione molto inferiore.
Tutti gli strumenti che ho elencato funzionano su Linux e alcuni su MacOS. Non credo che nessun lavoro su Windows sia ancora affidabile.