ABR - Klocwork错误警报和错误的错误处理

时间:2010-07-15 08:43:30

标签: c klocwork

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;
}

有什么想法吗?

3 个答案:

答案 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。