非同期安全ではない信号ハンドラーから呼び出された関数 (厳密な ISO C)
割り込み関数の呼び出しは未定義のプログラム動作を引き起こす
説明
この欠陥は、C 標準によると非同期安全ではない関数を信号ハンドラーが呼び出した場合に発生します。非同期安全な関数は、実行中のどの時点でも割り込んで再度呼び出すことができ、不整合な状態を発生させません。また、不整合な状態の可能性があるグローバル データを正しく処理できます。
C 標準では、POSIX 規格に従って非同期安全である関数のセットと比較して、より厳密な関数のサブセットを非同期安全として定義しています。"非同期安全ではない信号ハンドラーから呼び出された関数 (厳密な ISO C)" は、関数が POSIX 規格に従って非同期安全である場合でも、信号ハンドラーがそのサブセットに含まれていない関数を呼び出したときに欠陥を報告します。
POSIX 規格に従って非同期安全ではない関数の呼び出しをチェックするには、チェッカーの "非同期安全ではない信号ハンドラーから呼び出された関数" を有効にします。
信号ハンドラーで、非同期安全ではない関数を呼び出す別の関数を呼び出す場合、その信号ハンドラーの関数呼び出しに欠陥が表示されます。欠陥のトレースバックには、信号ハンドラーから非同期安全ではない関数までの絶対パスが表示されます。
リスク
信号ハンドラーが呼び出されたときに、プログラムの実行が割り込まれます。ハンドラーが終了した後、割り込まれた箇所からプログラムの実行が再開します。関数が非同期安全ではない限り、割り込み時に関数が実行中の場合、信号ハンドラーからのその関数の呼び出しは未定義の動作です。
修正方法
C 標準では、次の関数を非同期安全として定義しています。信号ハンドラーから次の関数を呼び出すことができます。
abort()
_Exit()
quick_exit()
signal()
例
結果情報
グループ: プログラミング |
言語: C | C++ |
既定値: オフ |
コマンド ライン構文: SIG_HANDLER_ASYNC_UNSAFE_STRICT
|
影響度: Medium |
バージョン履歴
R2017b で導入