さまざまな種類の未定義の動作(特定の競合状態)が存在しないことを絶対に確認する方法はありません。
ただし、このような状況を適切に表示するツールは多数あります。修正が有効であることを証明できなくても、現在そのようなツールに問題があることを証明できる場合があります。
この目的のためのいくつかの興味深いツール:
Valgrindはメモリチェッカーです。メモリリーク、未初期化メモリの読み取り、ダングリングポインターの使用、および範囲外アクセスを検出します。
Helgrindは、スレッドセーフティチェッカーです。競合状態を見つけます。
両方とも動的なインスツルメンテーションによって機能します。つまり、プログラムをそのまま使用し、仮想化環境で実行します。これにより、邪魔になりませんが、時間がかかります。
UBSanは未定義の動作チェッカーです。整数のオーバーフロー、範囲外のシフトなど、CおよびC ++の未定義の動作のさまざまなケースを検出します。
MSanはメモリチェッカーです。Valgrindと同様の目標があります。
TSanはスレッドセーフティチェッカーです。Helgrindと同様の目標があります。
これら3つはClangコンパイラに組み込まれ、コンパイル時にコードを生成します。これは、それらをビルドプロセスに統合する必要があることを意味します(特に、Clangでコンパイルする必要があります)。これにより、* grindよりも初期セットアップがはるかに難しくなりますが、一方で、ランタイムオーバーヘッドははるかに低くなります。
リストしたツールはすべてLinux上で動作し、一部はMacOS上で動作します。私はまだWindowsで確実に動作するとは思わない。