如何通过 Cppcheck 解释 Null 指针取消引用?

Posted

技术标签:

【中文标题】如何通过 Cppcheck 解释 Null 指针取消引用?【英文标题】:How to interpret Null pointer dereference by Cppcheck? 【发布时间】:2018-06-21 08:47:30 【问题描述】:

我在审查过程中遇到了一个代码,当我使用 cpp 检查时,它指出空指针取消引用错误。我无法弄清楚原因。 下面是代码:

CopyMemory(NULL, dummyMatrixManager.GetConstDataPtr(), dummyMatrixManager.GetNumberOfElements() * sizeof(tFloat)); 

void CopyMemory( tFloat* pDst, const tFloat* pSrc, const tSize nBytes )

    // copy data if pointer to this memory is valid
    if (NULL != pDst)
    
        memcpy(pDst, pSrc, nBytes);
    
    else
    
        LOG_ERROR("No Data copied because memory was not properly allocated. Destination pointer was set to NULL.");
    

谢谢

【问题讨论】:

奇怪的代码。尤其是这种情况:(NULL != pDst). @Ron: 是的..很奇怪 NULL 从一开始就是标准 C++。不知道为什么评论者会遇到麻烦。 @Ron 检查NULL 是否传入有什么奇怪的? @Ron 有一种相当流行的风格,它更喜欢 == 比较左侧的常量,以确保如果程序员不小心键入了 =,代码将无法编译。尽管我自己不使用那种风格,但我认为它没有什么奇怪的。 @Ron 来自过去,编译器没有在 if 语句中警告 =。将 NULL 放在左边会导致编译错误。 【参考方案1】:

void CopyMemory( tFloat* pDst, const tFloat* pSrc, const tSize nBytes ) 有 2 个参数作为指针传递,pDstpSrc。但是,在调用memcpy(pDst, pSrc, nBytes) 之前,只检查pDstNULL,而不是pSrc

【讨论】:

它没有帮助。 Cppcheck 在 CopyMemory 函数调用行仍然显示错误。【参考方案2】:

我是一名 Cppcheck 开发人员。警告可能是错误的,但当我无法重现时很难说。

我希望您使用的是最新版本的 Cppcheck(1.84 是最新版本)。

默认的文本输出并没有说明为什么 Cppcheck 认为有一个 NULL 指针。你能试试--template=gcc吗?你应该可以看到 Cppcheck 是如何得出有一个空指针的结论的。

最好的问候, Daniel Marjamäki

【讨论】:

我使用 1.84 进行了复制,即使使用了 template=gcc。有关代码,请参见我上面的答案(现在在下面)。

以上是关于如何通过 Cppcheck 解释 Null 指针取消引用?的主要内容,如果未能解决你的问题,请参考以下文章

cppcheck 空指针取消引用,但它实际上可以变为空

cppcheck 检测到资源泄漏 - 误报?

检查C代码时cppcheck不扩展宏?

cppcheck 空指针取消引用:m_buffer - 否则检查它是不是为空是多余的

将堆指针传递给函数时,cppcheck 无法检测到泄漏?

如何在 Xcode 中显示 cppcheck 输出?