errno の不適切な使用
errno がエラー状態について正しくチェックされていない
説明
この欠陥は、errno をチェックしてもエラーがないことが保証されない状況で、errno でエラー状態をチェックした場合に発生します。場合によっては、errno をチェックすることによって誤検知につながる可能性があります。
たとえば、次の関数呼び出し後に errno をチェックします。
fopen: ISO® 規格に従う場合、この関数はエラーでerrnoを設定しない可能性があります。atof: ISO 規格に従う場合、この関数はerrnoを設定しません。signal: この関数がSIG_ERRエラー インジケーターを返す場合のみ、errnoの値がエラーを示します。
リスク
ISO C 標準では、これらの関数は必ずしもエラーで errno を設定しません。関数が errno を設定するかどうかは、実装によって異なります。
エラーを検出するため errno のみをチェックする場合、このチェックの妥当性も実装によって異なります。
場合によっては、関数が特定のエラー インジケーターを返す場合のみ、errno の値がエラーを示します。関数の戻り値をチェックする前に errno をチェックする場合、誤検出が発生する可能性があります。
修正方法
エラーの検出方法の詳細は、その特定の関数のドキュメンテーションを参照してください。
通常、そのような関数はエラーを示すために帯域外エラー インジケーターを返します。次に例を示します。
fopenは、エラーが発生すると NULL ポインターを返します。signalは、SIG_ERRエラー インジケーターを返し、errnoに正の値を設定します。この関数の戻り値をチェックした後のみerrnoをチェックします。
例
結果情報
| グループ: プログラミング |
| 言語: C | C++ |
| 既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: ERRNO_MISUSE |
| 影響度: High |
バージョン履歴
R2017a で導入