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 の値をチェックしません。