信号ハンドラー内からの信号呼び出し
非永続的な信号ハンドラーが Windows システム内で signal() を呼び出すことによる競合状態の発生
説明
この欠陥は、Windows® プラットフォームで信号ハンドラーから関数 signal() を呼び出す場合に発生します。
この欠陥は、Visual Studio コンパイラを指定した場合にのみ検出されます。コンパイラ (-compiler) を参照してください。
リスク
関数 signal() は、信号と信号ハンドラー関数を関連付けます。信号の受信後にこの関連付けが削除される Windows などのプラットフォーム上では、"信号ハンドラー内で" 再度関数 signal() を呼び出して、関連付けを再設定することができます。
ただし、信号ハンドラーを永続的にするこの試みによって、競合状態が引き起こされやすくなります。Windows プラットフォームでは、信号ハンドラーが実行を開始してから、関数 signal が再度呼び出されるまでの間に、アクティブになっているのは既定の信号処理 SIG_DFL です。この間に 2 つ目の信号が受信されると、ユーザーの期待に反して、カスタム信号ハンドラーではなく既定の信号ハンドラーが示されます。
修正方法
Windows プラットフォームでは信号ハンドラーから signal() を呼び出さないようにします。
例
結果情報
| グループ: プログラミング |
| 言語: C | C++ |
| 既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: SIG_HANDLER_CALLING_SIGNAL
|
| 影響度: Medium |
バージョン履歴
R2017b で導入