Não há como ter certeza absoluta 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ê poderá provar que existe atualmente um problema com essas ferramentas, mesmo que não possa provar que sua correção é válida.
Algumas ferramentas interessantes para esse fim:
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.
Helgrind é um verificador de segurança de threads. Encontra condições de corrida.
Ambos trabalham com instrumentação dinâmica, ou seja, eles pegam seu programa como estão e o executam em um ambiente virtualizado. Isso os torna intrusivos, mas lentos.
O UBSan é um verificador de comportamento indefinido. Ele encontra vários casos de comportamento indefinido em C e C ++, como estouros de número inteiro, mudanças fora do intervalo e coisas semelhantes.
MSan é um verificador de memória. Tem objetivos semelhantes aos de Valgrind.
TSan é um verificador de segurança de threads. Tem objetivos semelhantes aos do Helgrind.
Esses três são incorporados ao compilador Clang e geram código em tempo de compilação. Isso significa que você precisa integrá-los ao seu processo de compilação (em particular, é necessário compilar com o Clang), o que os torna muito mais difíceis de configurar inicialmente do que o * grind, mas por outro lado, eles têm uma sobrecarga de tempo de execução muito menor.
Todas as ferramentas listadas funcionam no Linux e algumas no MacOS. Eu não acho que nenhum trabalho no Windows ainda seja confiável.