CXX.ERRNO.NOT_CHECKED
调用库函数后缺少 Errno 条件检查
CXX.ERRNO.NOT_CHECKED 检查器会标记在调用设置 errno 值的库函数后未检查 errno 值的情况。
漏洞与风险
errno 的值可能是以前调用库函数时设置的。在调用设置 errno 值的库函数后未检查 errno 值,可能导致代码的错误执行。
缓解与预防
在调用设置 errno 值的库函数后,始终检查 errno 的值。
漏洞代码示例 1
复制
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
void func(const char *c_str) {
unsigned long number;
char *endptr;
errno=0;
number = strtoul(c_str, &endptr, 0);
}
在此不符合要求的示例中,代码无法在调用 strtoul() 后检查 errno 的值。如果发生错误,strtoul() 会返回有效值 (ULONG_MAX),因此 errno 是确定 strtoul() 是否成功运行的唯一方法。
修正代码示例 1
复制
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
void func(const char *c_str) {
unsigned long number;
char *endptr;
errno = 0;
number = strtoul(c_str, &endptr, 0);
if (errno == ERANGE) {
/* Handle error */
} else {
/* Computation succeeded */
}
}
在此修正代码示例中,代码会在调用 strtoul() 后检查 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 的值。