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

ABR-Klocwork假警报和错误错误处理,c,klocwork,C,Klocwork,Klocwork报告了一个错误:- “ABR–缓冲区溢出,数组索引为 “oidsp”可能超出范围。数组 大小为64的“oidsp”可以使用索引 值-2..-1。“ 对于该线路: if (check_index_lower_legality (len,-1)) { oidsp[len-1] = specProb; } 当检查索引较低时,合法性为:- bool check_index_lower_legality (int index, int offset) /** * This functi

Klocwork报告了一个错误:-

“ABR–缓冲区溢出,数组索引为 “oidsp”可能超出范围。数组 大小为64的“oidsp”可以使用索引 值-2..-1。“

对于该线路:

if (check_index_lower_legality (len,-1))
{
oidsp[len-1] = specProb;
}
当检查索引较低时,合法性为:-

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

有什么想法吗?

我认为Klocwork无法遵循这种逻辑。您需要告诉它check\u index\u lower\u合法性的行为是这样的。

这是错误的错误。您需要添加额外的检查,以告知len始终大于1

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

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

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

我可能遗漏了一些东西,但是您的函数(check\u index\u lower\u legability)没有修改'len'变量,也没有从用于访问数组的函数返回值,因此您提供的代码片段似乎正确地生成了运行时缓冲区下溢(对于len<0的值)。如果您认为报告确实不正确,您是否可以对示例进行扩展


谢谢你,Gwyn。

你能用101010按钮格式化你的代码吗?这真的很难读懂。嗨,我的函数没有修改任何东西。如果两个参数之和小于零,它会回答0。因此,在上面的例子中,不会有运行时缓冲区下溢。Klocwork似乎不理解由fun完成的检查Action应该可以消除这个错误。我在char*Null终止方面也遇到过类似的问题。看来Klocwork在理解之前调用的一两行函数已经解决了这个错误,并且不需要再次检查方面遇到了问题。你是对的,我的错。我的阅读速度太快了。正如另一张海报所说,m将其命名为FP(不是问题),我们将把该状态传播到所有后续版本中。在您关于NNTS的另一个评论中,升级到9.1应该会消除绝大多数这些问题,正如我在该线程中所评论的那样。
if (check_index_lower_legality (len,-1)) 
{
if(len > 1) 
oidsp[len-1] = specProb; 
}