针对C ++项目报告了奇怪的Klocwork问题

时间:2014-03-04 03:02:45

标签: c++ nullpointerexception buffer-overflow klocwork

我发现Klocwork报告的一些问题很奇怪。例如 -

if(NULL == m_pMutex.get())
{
    Log("found unexpected sharedPtr m_pMutex");
    return -1;
}

Time_Critical_Section cs(*m_pMutex);

对于上面的代码,Klocwork报告NULL指针取消引用。但我不认为这是一个有效的问题。好像指针为null,它将从函数返回,并且没有机会访问指针。但是,Stil Klocwork报告说这是一个问题。

另一个问题是 -

 char buf[1000];
 sprintf(buf,"%s",name);

对于上面的代码Klocwork说上面的代码部分可能导致Buffer溢出,'buf'的数组索引可能超出范围。但我们确认名称变量不会超过1000个字节。但Klocwork仍然将此视为一个问题。

我们需要使代码没有错误,并且最终代码不应包含Klocwork的任何问题。有人能建议一种有效的方法来克服上述问题吗?

1 个答案:

答案 0 :(得分:1)

找到空指针解除引用问题的根本原因。让我们解释为什么这段代码得到空指针解除引用。

if(NULL == m_pMutex.get())
{
    Log("found unexpected sharedPtr m_pMutex");
     return -1;
}

Time_Critical_Section cs(*m_pMutex);

因为在检查“Time_Critical_Section cs(* m_pMutex);”中的指针时,Klocwork是一个静态代码分析器。它在open块中找到它虽然之前已经检查过,如果指针为null,我们从函数返回值为-1。当Klocwork进行静态代码分析时,它不知道它早先已经将指针检查为open块中指针的访问代码。我们可以通过以下方式修改代码来解决这个问题 -

if(NULL == m_pMutex.get())
{
   Log("found unexpected sharedPtr m_pMutex");
   return -1;
}
else
{

   Time_Critical_Section cs(*m_pMutex);
   //Do some operations
   return 0;
}