Não há como ter absoluta certeza de que vários tipos de comportamento indefinido (em particular condições de corrida) não existem.
No entanto, existem várias ferramentas que mostram um bom número dessas situações. Você pode provar que um problema existe atualmente com essas ferramentas, mesmo que você não possa provar que sua correção é válida.
Algumas ferramentas interessantes para esse propósito:
Valgrind é um verificador de memória. Ele encontra vazamentos de memória, leituras de memória não inicializada, uso de ponteiros pendentes e acessos fora dos limites.
O Helgrind é um verificador de segurança de threads. Encontra condições de corrida.
Ambos funcionam por instrumentação dinâmica, ou seja, eles levam seu programa como está e o executam em um ambiente virtualizado. Isso os torna não intrusivos, mas lentos.
O UBSan é um verificador de comportamento indefinido. Ele encontra vários casos de comportamento indefinido em C e C ++, como transbordamentos de inteiros, deslocamentos fora do intervalo e coisas semelhantes.
MSan é um verificador de memória. Tem objetivos semelhantes aos de Valgrind.
O TSan é um verificador de segurança de threads. Tem objetivos semelhantes aos de Helgrind.
Estes três são construídos no compilador Clang e geram código em tempo de compilação. Isso significa que você precisa integrá-los em seu processo de compilação (em particular, você deve compilar com o Clang), o que os torna muito mais difíceis de configurar do que o * grind, mas por outro lado eles têm uma sobrecarga de tempo de execução muito menor.
Todas as ferramentas que listei funcionam no Linux e algumas delas no MacOS. Eu não acho que qualquer trabalho no Windows de forma confiável ainda.