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++ 分析。