CXX.ERRNO.INCORRECTLY_CHECKED

调用库函数后不需要进行 Errno 条件检查

CXX.ERRNO.INCORRECTLY_CHECKED 检查器会标记在调用未设置 errno 值的库函数后检查 errno 值的情况。

漏洞与风险

在以前调用库函数之后,可能错误地检查了 errno 的值。在调用不使用 errno 的库函数后检查 errno 的值,可能导致代码的错误执行。

缓解与预防

在调用不使用 errno 的库函数后,永不检查 errno 的值。

漏洞代码示例 1

复制
  #include <errno.h>
  #include <stdio.h>
  
  void func(const char *filename) {
    FILE *fileptr;
   
    fileptr = fopen(filename, "rb");
    if (errno != 0) {
      /* Handle error */
   }
 }

在此不符合要求的示例中,代码可能无法诊断错误,因为即使发生错误,fopen() 也可能无法设置 errno 的值。

修正代码示例 1

复制
   #include <stdio.h>
     
   void func(const char *filename) {
     FILE *fileptr = fopen(filename, "rb");
     if (fileptr == NULL)  {
       /* An error occurred in fopen() */
     }
   }

C 标准在描述 fopen() 时没有提到 errno。在此修正代码示例中,代码使用调用 fopen() 的结果来确定故障;代码不检查 errno 的值。

漏洞代码示例 2

复制
  #include <errno.h>
  #include <stdio.h>
    
  void func(const char *filename) {
    FILE *fileptr;
   
    errno = 0;
    fileptr = fopen(filename, "rb");
    if (errno != 0) {
     /* Handle error */
   }
 }

在此不符合要求的示例中,代码可能无法诊断错误,因为即使发生错误,fopen() 也可能无法设置 errno 的值。

修正代码示例 2

复制
  #include <stdio.h>
    
  void func(const char *filename) {
    FILE *fileptr = fopen(filename, "rb");
    if (fileptr == NULL)  {
      /* An error occurred in fopen() */
    }
  }

C 标准在描述 fopen() 时没有提到 errno。在此修正代码示例中,代码使用调用 fopen() 的结果来确定故障,并且不检查 errno 的值。

扩展

此检查器可通过 Klocwork 知识库 (KB) 进行扩展。有关详情,请参阅调整 C/C++ 分析。