1

MSVC コンパイラに、最初に書かれた瞬間 (1 年以上前) に次のバグが表示された可能性のあるオプションがあるかどうかを知りたいです。その時点で、バグはコピーされ、コード内の他のいくつかの場所に貼り付けられました。権利により、数秒ごとにクラッシュを引き起こすはずでした。幸運なことに、代わりに数時間ごとにクラッシュするだけで、通常はデバッグする証拠がほとんど残りません。バグのあるコードの本質は次のようなものでした:

int someDataSubjectToMultiThreadAccess;
CCriticalSection someSyncObject;
...
int SomeFunction( void )
{
  CSingleLock( someSyncObject, TRUE );
  return someDataSubjectToMultiThreadAccess;
}

エラーを強調表示するつもりはありません - Visual Studio コンパイラは確かにそうではありません! エラーが表示されない場合は、テスト ファイルを作成してコンパイルし、.cod ファイルを調べて、生成されたアセンブラーを確認します。私の最適化設定では、CSingleLockコンストラクタを呼び出して一時オブジェクトを作成し、すぐに対応するデストラクタを呼び出します。これは(最適化によって?)CSingleLock::Unlock()関数です。最後に、共有データは実際にロックされることなくアクセスされます。

したがって、これは、関数のスコープ全体で続く変数を省略することによって、まったく効果のないロック メカニズムを作成する方法についての警告ですCSingleLock vitalLockVariable( someLock, TRUE );。このコードを見て、バグに気づかなかった人の数には驚きました。

「代わりにブースト同期プリミティブを使用してください」というアドバイスを入力する手間を省きます。はい - ありがとう - いつかそうするでしょう。しかし、この種のスリップはおそらく彼らにも同じように当てはまります。

私が本当に知りたいのは、コード レビューや不可解なクラッシュの分析以外の方法で、できれば入力した瞬間に、この種のものをキャッチするために利用できるツールは何かということです。

4

0 に答える 0