0

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

有任何想法吗?

4

3 回答 3

1

这是错误的错误。您需要添加额外的检查以始终告诉 len > 1。

所以你可以通过添加一个完全不需要的 if 条件来跳过这个错误。

if (check_index_lower_legality (len,-1)) 
{
if(len > 1) 
oidsp[len-1] = specProb; 
} 

或者您可以将此错误标记为误报并再次运行 klockworks。它很可能会在下一份报告中跳过这一点。

于 2010-07-15T09:01:51.423 回答
0

我不认为 Klocwork 可以遵循这种逻辑。您需要告诉它 check_index_lower_legality 以这种方式运行。

于 2010-07-15T08:50:40.950 回答
0

我可能遗漏了一些东西,但是您的函数 (check_index_lower_legality) 不会修改“len”变量,函数的返回也不会用于访问您的数组,因此您提供的代码段似乎会正确生成运行时缓冲区下溢(对于 len < 0) 的值。如果您认为该报告确实不正确,您是否可以扩展该示例?

谢谢,格温。

于 2010-07-15T12:39:16.097 回答