setjmp/longjmp の使用
setjmp と longjmp により通常の制御フローからの逸脱が発生
説明
この欠陥は、setjmp と longjmp あるいは sigsetjmp と siglongjmp の組み合わせを使用して、通常の制御フローから逸脱し、コード内で非ローカル ジャンプを実行した場合に発生します。
リスク
setjmp と longjmp、あるいは sigsetjmp と siglongjmp を使用すると、次のようなリスクがあります。
ローカルではないジャンプは、バッファー オーバーフローのような一般的なエラーを狙った攻撃に対し脆弱です。攻撃者は制御フローをリダイレクトし、任意のコードを実行することができます。
動的に割り当てられたメモリや開いているファイルなどのリソースが閉じられず、リソース リークが発生する可能性があります。
setjmpとlongjmpが信号ハンドラーとの組み合わせで使用されると、想定外の制御フローが発生することがあります。POSIX® では、setjmpが信号マスクを保存するかどうかを指定しません。setjmpとlongjmpあるいはsigsetjmpとsiglongjmpを使用すると、プログラムの理解と保守が難しくなります。
修正方法
setjmp/longjmp または sigsetjmp/siglongjmp を使用して、コード内のローカルではないジャンプを、ジャンプが安全に実行できるコンテキストでのみ実行します。あるいは、可能な場合は POSIX スレッドを使用します。
C++ の場合、例外のスローとキャッチをシミュレートするため、throw 式や catch ステートメントなどの標準イディオムを使用します。
例
結果情報
| グループ: 適切な手法 |
| 言語: C | C++ |
| 既定値: オフ |
コマンド ライン構文: SETJMP_LONGJMP_USE |
| 影響度: Low |
バージョン履歴
R2015b で導入