Klocwork报告错误: -
“ABR - 缓冲区溢出,数组索引 'oidsp'可能超出范围。排列 大小为64的'oidsp'可以使用索引 价值-2 ..- 1.“
对于这一行: -
if (check_index_lower_legality (len,-1))
{
oidsp[len-1] = specProb;
}
当check_index_lower_legality为: -
时bool check_index_lower_legality (int index, int offset)
/**
* This function checks that the index with the offset isn't
* below zero.
* If it is - returns 0 ;
* If isn't - returns 1 ;
**/
{
if ( (index + offset )<0) {
return 0;
}
return 1 ;
}
但check_index_lower_legality
时没有错误: -
(这是一个错误的答案,对于-2或-1的偏移值,运行时会出现真正的错误。
bool check_index_lower_legality (int index, int offset)
/**
* This function checks that the index with the offset isn't
* below zero.
* If it is - returns 0 ;
* If isn't - returns 1 ;
**/
{
if (index <=0) {
return 0;
}
return 1;
}
有什么想法吗?
答案 0 :(得分:1)
这是错误的错误。你需要添加额外的检查来告诉len是&gt;总是1。
因此,您可以通过添加完全不需要的if条件来跳过此错误。
if (check_index_lower_legality (len,-1))
{
if(len > 1)
oidsp[len-1] = specProb;
}
或者您可以将此错误标记为虚假警报并再次运行klockworks。在最可能的意义上,它将在下一份报告中跳过这一点。
答案 1 :(得分:0)
我不认为Klocwork可以遵循这种逻辑。你需要告诉它check_index_lower_legality就是这样的。
答案 2 :(得分:0)
我可能会遗漏一些东西,但是你的函数(check_index_lower_legality)不会修改'len'变量,也不会修改用于访问数组的函数的返回,所以你提供的代码片段似乎正确生成了运行时缓冲区下溢(对于len <0的值)。如果你认为报告真的不正确,你可以扩展一下这个例子吗?
谢谢,Gwyn。