CERT.FSETPOS.VALUE
只有从 fgetpos() 函数返回的值才能用作 fsetpos() 函数的参数。
CERT.FSETPOS.VALUE 检查器会标记 fsetpos() 函数被不是由 fgetpos() 函数创建的 fpos_t 类型参数调用的情况。
漏洞与风险
如果使用不是由 fgetpos() 函数创建的 fpos_t 类型参数来调用 fsetpos() 函数,可能会导致未定义的行为。
缓解与预防
验证 fsetpos() 函数是否始终使用从 fgetpos() 函数返回的位置值。
漏洞代码示例
复制
#include <stdio.h>
#include <string.h>
int opener(FILE *file)
{
int rc;
fpos_t offset;
memset(&offset, 0, sizeof(offset));
if (file == NULL) {
return -1;
}
/* Read in data from file */
fsetpos(file, &offset);
if (rc != 0 ) {
return rc;
}
return 0;
}
在此不符合要求的示例中,Klocwork 在第 15 行报告了 CERT.FSETPOS.VALUE 缺陷,因为 fsetpos() 函数使用了不是由 fgetpos() 函数创建的值 offset。
修正代码示例
复制
#include <stdio.h>
#include <string.h>
int opener(FILE *file)
{
int rc;
fpos_t offset;
memset(&offset, 0, sizeof(offset));
if (file == NULL) {
return -1;
}
fgetpos(file, &offset);
/* Read in data from file */
fsetpos(file, &offset);
if (rc != 0 ) {
return rc;
}
return 0;
}
以上代码符合要求,因为 fsetpos() 函数使用了之前由 fgetpos() 函数创建的值 offset。