我发现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的任何问题。有人能建议一种有效的方法来克服上述问题吗?
答案 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;
}