データ レース
複数タスクによる共有変数に対する保護されない非アトミック操作の実行
説明
このチェッカーは、既定の Polyspace® as You Code 解析では非アクティブにされます。Polyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください。
この欠陥は、以下の場合に発生します。
複数のタスクが保護されない操作を共通の変数に実行。
少なくとも 1 つのタスクが書き込み操作を実行。
少なくとも 1 つの操作が非アトミック。アトミック操作と非アトミック操作の両方でデータ レースを検出するには、オプション
[-detect-atomic-data-race]を使用します。Extend Data Race Checkers to Atomic Operationsを参照してください。マルチタスキング コードでのアトミック操作の定義を参照してください。
欠陥チェッカーは、競合する読み取り/書き込み操作または書き込み/書き込み操作のある共有変数ごとに、1 つのデータ レース結果を報告します。結果ごとのイベント リストに、競合するアクセスのリストが表示されます。このリストは、競合するアクセスの代表的なものを示すもので、すべてを網羅しているわけではありません。
このチェッカーを先にマルチタスキング オプションを指定せずに有効にした場合は、ログに警告が書き込まれます。
Warning: Checker 'Data Race' is activated but no protection have been defined
この欠陥を検出するには、次のいずれかの方法で共有変数のタスクおよび保護を指定します。
Polyspace Bug Finder™ で自動的に検出できるいずれかの同時実行プリミティブ型を呼び出します。Polyspace でのスレッド作成とクリティカル セクションの自動検出を参照してください。
解析前に構成オプションとして明示的に共有変数のタスクおよび保護を指定します。マルチタスキングを参照してください。
リスク
異なるタスクでの操作の順序は制御されないため、データ レースにより共有変数が予測不能な値になる可能性があります。
2 つの書き込み操作間のデータ レースは、書き込み操作と読み取り操作間のデータ レースよりも深刻です。2 つの書き込み操作が相互に干渉し、不確定な値になる可能性があります。書き込みどうしの競合を特定するには、[結果のリスト] ペインの [詳細] 列でフィルターを使用します。これらの競合について、[詳細] 列に次の追加行が表示されます。
Variable value may be altered by write-write concurrent access.
修正方法
この欠陥を修正するには、クリティカル セクション、時間的に排他、または別の方法を使用して、共有変数に対する操作を保護します。マルチタスキング コードでの共有変数の保護を参照してください。
再利用できる既存の保護を特定するには、結果に関連付けられている表とグラフを確認します。表では競合する呼び出しの各ペアが示されます。[アクセス保護] 列には、その呼び出しについての既存の保護が表示されます。競合につながる関数呼び出しの順序を確認するには、
アイコンをクリックします。以下の例を参照してください。
チェッカーの拡張
Bug Finder では既定で検出されない可能性がある、演算でのデータ レースをチェックするように、このチェッカーを拡張します。次に例を示します。
Polyspace ではサポートされていないマルチスレッド関数を使用する場合があります。その場合、マルチスレッド関数の各関数を、それぞれに対応する既知の POSIX® 関数にマッピングすることで、このチェッカーを拡張します。サポートされていないマルチスレッド環境への同時実行欠陥チェッカーの拡張を参照してください。
Polyspace は、特定の操作はアトミックであると仮定し、それらの操作をデータ レース チェックから除外します。マルチタスキング コードでのアトミック操作の定義を参照してください。ご使用の環境には、これらの仮定が当てはまらない場合があります。これらの操作を含めるようにデータ レース チェッカーを拡張するには、オプション
-detect-atomic-data-raceを使用します。Extend Data Race Checkers to Atomic Operationsを参照してください。
チェッカーは共有変数ごとに 1 つのデータ レース結果を報告します。結果のイベント リストには、限られた数の競合する読み取り/書き込みと、書き込みどうしの競合が表示されます。これらの制限はカスタマイズできません。
例
結果情報
| グループ: 同時実行 |
| 言語: C | C++ |
| 既定値: オン |
コマンド ライン構文: DATA_RACE |
| 影響度: High |
バージョン履歴
R2014b で導入
参考
すべての割り込みを無効にする (-routine-disable-interrupts -routine-enable-interrupts) | 時間的に排他なタスク (-temporal-exclusions-file) | クリティカル セクション詳細 (-critical-section-begin -critical-section-end) | タスク (-entry-points) | マルチタスクを手動で構成 | ターゲット プロセッサ タイプ (-target) | 欠陥の検出 (-checkers) | 標準ライブラリ関数呼び出しでデータ レースが発生しました | デッドロック | ロックされたミューテックスの破棄 | ダブル ロック | ロック解除が重複しています | ロックされていません | ロック解除されていません
トピック
- Polyspace でのマルチタスキング プログラムの解析
- マルチタスキング コードでの共有変数の保護
- Polyspace デスクトップ ユーザー インターフェイスでの Bug Finder の結果の解釈
- Polyspace Access Web インターフェイスでの Bug Finder の結果の解釈 (Polyspace Access)
- Polyspace ユーザー インターフェイスでのバグ修正または正当化による結果への対処
- Polyspace Access でのバグ修正または正当化による結果への対処 (Polyspace Access)
- マルチタスキング コードでのアトミック操作の定義
- サポートされていないマルチスレッド環境への同時実行欠陥チェッカーの拡張
- Extend Data Race Checkers to Atomic Operations


