このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
標準ライブラリ関数呼び出しでデータ レースが発生しました
スレッドセーフでない標準ライブラリ関数に対して、複数のタスクから保護されていない呼び出しが行われています。
説明
このチェッカーは、既定の Polyspace® as You Code 解析では非アクティブにされます。Polyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください。
この欠陥は、以下の場合に発生します。
複数のタスクから同じ標準ライブラリ関数を呼び出す。
たとえば、複数のタスクから
strerror
関数を呼び出します。呼び出しが共通の保護を使って保護されていない。
たとえば、呼び出しが同じクリティカル セクションによって保護されていません。
この欠陥によってフラグが付けられた関数は、再呼び出し可能であることは保証されません。前の呼び出しが実行を完了する前に、割り込まれたり、安全に再度呼び出されることができる場合、関数は再呼び出し可能です。関数が再呼び出し可能ではない場合、複数のタスクからその関数を保護なしで呼び出すと、同時実行の問題の原因となる可能性があります。フラグが付けられた関数のリストについては、次を参照してください。CON33-C:Avoid race conditions when using library functions。
この欠陥を検出するには、解析前にマルチタスキング オプションを指定しなくてはなりません。[構成] ペインで [マルチタスキング] を選択してこれらのオプションを指定します。詳細は、Polyspace マルチタスキング解析の手動設定を参照してください。
リスク
この欠陥によってフラグが付けられた関数は、その実装でグローバル変数や静的変数が使用される可能性があるため、再呼び出し可能ではありません。複数のタスクから保護なしでその関数を呼び出すと、一方のタスクからの関数呼び出しが別のタスクからの呼び出しに干渉する可能性があります。その関数の 2 つの呼び出しがグローバル変数や静的変数に同時にアクセスし、予期しない結果が生じる可能性があります。
この呼び出しが、異常終了、サービス拒否攻撃、データの整合性違反など、より深刻なセキュリティの脆弱性の原因となることもあります。
修正方法
この欠陥を修正するには、以下のいずれかを行います。
標準ライブラリ関数の再呼び出し可能なバージョンが存在する場合はそちらを使用します。
たとえば、
strerror()
ではなく、strerror_r()
またはstrerror_s()
を使用します。この欠陥によってフラグが付けられた関数の代替方法については、「CON33-C」を参照してください。共通のクリティカル セクションまたは時間的に排他を使用して、その関数呼び出しを保護します。
クリティカル セクション詳細 (-critical-section-begin -critical-section-end)
および時間的に排他なタスク (-temporal-exclusions-file)
を参照してください。再利用できる既存の保護を特定するには、結果に関連付けられている表とグラフを確認します。表では競合する呼び出しの各ペアが示されます。[アクセス保護] 列には、その呼び出しについての既存の保護が表示されます。競合につながる関数呼び出しの順序を確認するには、
アイコンをクリックします。以下の例を参照してください。
例
結果情報
グループ: 同時実行 |
言語: C | C++ |
既定値: オン |
コマンド ライン構文: DATA_RACE_STD_LIB |
影響度: High |
バージョン履歴
R2016b で導入