コードをチェックするために 2 つのことを行います。徹底的なグループ コード レビュー (スタイルやその他のエラーではなく、再入エラーのみを見つけることを目的としています)。第二に、問題に対する実際的な攻撃。
例えば:
int myfunction(int x, int y) {
REENTRANCE_CHECK;
... body of function
}
REENTRANCE_CHECK を #define して空にする (本番用) か、関数が再入力されないようにチェックするコードを指定できるようになりました。これらのチェックを有効にしてテストを実行し (テストがない場合は、デバッガーが接続されたデバイスで実行します)、問題が発生するかどうかを確認します。
同様に、デバッグ ロジックを追加して、グローバル状態への不適切な更新を検出できます。ロックを使用するコードを記述します (ロックが既に保持されているときに取得された場合にアサートします。
このようなもの:
int my_global;
DEFINE_GLOBAL_LOCK(my_global);
void my_dangerous_function() {
...
LOCK_GLOBAL(my_global);
.. some critical section of code that uses my_global.
UNLOCK_GLOBAL(my_global);
...
}
繰り返しになりますが、DECLARE_GLOBAL_LOCK、LOCK_GLOBAL、および UNLOCK_GLOBAL は、テスト用に実際のロック コード (もちろん、これを作成する必要があります) として #defined にすることも、本番環境では何も #defined にすることもできます。
このアプローチは、グローバル状態へのすべてのアクセスを見つけてラップする場合にのみ機能しますが、検索を使用すると簡単です。