CXX.ERRNO.INCORRECTLY_CHECKED
ライブラリ関数を呼び出した後に、errno の条件チェックは不要である
CXX.ERRNO.INCORRECTLY_CHECKED チェッカーは、値を設定しないライブラリ関数を呼び出した後に errno 値がチェックされるケースにフラグを立てます。
脆弱性とリスク
ライブラリ関数を以前に呼び出した後に、errno の値が間違ってチェックされる可能性があります。errno 値を使用しないライブラリ関数を呼び出した後に errno 値をチェックすると、コードは間違って実行される可能性があります。
軽減と防止
errno を使用しないライブラリ関数を呼び出した後は、errno の値を一切検査しないでください。
脆弱コード例
1 #include <errno.h> 2 #include <stdio.h> 3 4 void func(const char *filename) { 5 FILE *fileptr; 6 7 fileptr = fopen(filename, "rb"); 8 if (errno != 0) { 9 /* Handle error */ 10 } 11 }
この準拠していない例では、エラーが発生しても fopen() は errno の値を設定しない場合があるため、コードはエラーを診断することに失敗する可能性があります。
修正コード例
1 #include <stdio.h> 2 3 void func(const char *filename) { 4 FILE *fileptr = fopen(filename, "rb"); 5 if (fileptr == NULL) { 6 /* An error occurred in fopen() */ 7 } 8 }
C 標準では、fopen() を説明するときに errno については何も言及していません。この修正された例では、コードは fopen() を呼び出した結果を使用して失敗を判断しており、コードは errno の値をチェックしません。