12

私は現在、最近多くの変更が加えられた大規模なプロジェクトに取り組んでおり、最も顕著なのはスレッドサポートの追加です。

コードを調べているうちに、競合状態を引き起こす可能性のあるセクションを特定しました。このようなリグレッションを防ぐために、その特定のリージョンで競合状態を確実に検出して、今後のコミットでこの障害が発生しないようにするテストを書きたいと思います。
コードには sleep() ステートメントが散らばっていませんが、潜在的なデッドロックと競合地雷原であり、堅牢性を確保したいと考えています。

このプロジェクトは完全に C で書かれています。では、競合状態を防ぐために単体テストを書く方法はありますか?

4

3 に答える 3

3

競合状態は、本質的に非決定論の結果です。呼び出しシーケンスが安全であることを確認できない場合は、プロトコルの不変条件が守られていることを確認する多数のランタイム チェックを導入します。そうすれば、少なくとも、障害が発生するたびにその証拠が得られます。

これで問題が解決するわけではありませんが、少なくとも問題の範囲を定量化するツールが得られます。

いずれかのレースがアプリケーションの範囲外のイベントからトリガーされた場合、静的分析では、条件を検出できるようにこれもモデル化する必要があります。

于 2013-12-22T17:18:50.123 に答える
0

Valgrind DRD ツールを使用すると、多くのスレッド エラーを検出できます。このツールを使用して、通常のテスト ケースを実行するだけです。

于 2013-09-12T19:42:44.400 に答える