【问题标题】:Strange Klocwork issues reported for C++ project为 C++ 项目报告的奇怪的 Klocwork 问题
【发布时间】:2014-03-04 03:02:45
【问题描述】:

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

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

Time_Critical_Section cs(*m_pMutex);

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

另一个问题是-

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

对于上面的代码,Klocwork 说上面的代码部分会导致缓冲区溢出,'buf' 的数组索引可能超出范围。但我们确认名称变量不会大于 1000 字节。但 Klocwork 仍然报告这是一个问题。

我们需要让我们的代码没有错误,最终的代码不应该包含任何 Klocwork 的问题。任何人都可以提出一种有效的方法来克服上述问题吗?

【问题讨论】:

  • m_pMutexm_pMutex.get() 是指针吗?
  • m_pMutex 是 boost 的智能指针。您需要检查调用 get 的智能指针,我的意思是检查 m_pMutex 的 px。
  • 对于第二个问题,使用snprintf() 可能会删除 Klocwork 警告。
  • 如果我们使用 char* 而不是 char 数组呢?
  • 你仍然知道你为char *分配的大小。

标签: c++ nullpointerexception buffer-overflow klocwork


【解决方案1】:

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

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

Time_Critical_Section cs(*m_pMutex);

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 2018-01-13
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2011-04-11
    相关资源
    最近更新 更多