如何处理fread中的Coverity错误TAINTED_SCALAR

7
在读取整数类型的文件值时,Coverity检查出现以下错误:
调用函数"fread"污染了参数"readval"。
//coverity note: Calling function "fread" taints argument "readval".
if(fread(&readval, sizeof(int), 1, fp) < 1) {
    return;
} else {
    //coverity note: Passing tainted variable "readval" to a tainted sink.
    f1(&readval);
}

如何处理这个错误? 我需要执行哪些健全性检查来确保'readval'没有损坏。

f1()函数是做什么的? - Mark Robinson
f1 是 fseek(fp, readval, SEEK_SET); - coder
f1() 是如下的 fseek()Coverity 告诉我们 'jump_offset' 和 'readval' 都是 tainted 的。jump_offset = readval + header_size; fseek(fp, jump_offset, SEEK_SET); - coder
2个回答

2

所以问题在于你使用了受污染的值;)

更详细地说,readval一次由外部数据设置,然后可能作为fseek的参数使用。该参数可能会使你超出文件末尾并导致程序崩溃。

你需要添加一些检查来确保不会越过文件边界。


我们传递给 fseek 的参数可以来自任何地方。 - coder
我将在fseek返回值上添加检查,并再次运行Coverity检查以确保此修复。但是,我们传递给fseek的偏移参数(在这种情况下为jump_offset)可以来自任何地方。它可以从文件中读取,也可以通过某种方式计算。Coverity从fread开始显示通知。在阅读有关“污染”值的问题后,我不确定是否需要对fseek或fread本身的返回值进行检查。 - coder
我没有看到它被用作fseek()的参数?!?!? - user12411795

0
在从fread获取readval后立即添加一个assert。确保readval在合理范围内。
顺便说一下,你的“assert”也应该在发布版本中有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接