Non c'è modo di essere assolutamente sicuri che vari tipi di comportamento indefinito (in particolare le condizioni di gara) non esistano.
Tuttavia, esistono numerosi strumenti che mostrano un buon numero di tali situazioni. Potresti essere in grado di dimostrare che al momento esiste un problema con tali strumenti, anche se non puoi dimostrare che la tua correzione è valida.
Alcuni strumenti interessanti per questo scopo:
Valgrind è un controllore di memoria. Trova perdite di memoria, letture di memoria non inizializzata, uso di puntatori penzolanti e accessi fuori limite.
Helgrind è un controllo di sicurezza del thread. Trova condizioni di gara.
Entrambi funzionano con strumentazione dinamica, cioè prendono il tuo programma così com'è e lo eseguono in un ambiente virtualizzato. Questo li rende non invadenti, ma lenti.
UBSan è un controllo del comportamento non definito. Trova vari casi di comportamento non definito di C e C ++, come overflow integer, spostamenti fuori intervallo 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 il codice in fase di compilazione. Ciò significa che devi integrarli nel tuo processo di compilazione (in particolare, devi compilare con Clang), il che rende molto più difficile l'impostazione iniziale rispetto a * grind, ma d'altra parte hanno un sovraccarico di runtime molto più basso.
Tutti gli strumenti che ho elencato funzionano su Linux e alcuni su MacOS. Non credo che lavori su Windows siano ancora affidabili.