如何通过 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 个参数作为指针传递,pDst
和 pSrc
。但是,在调用memcpy(pDst, pSrc, nBytes)
之前,只检查pDst
与NULL
,而不是pSrc
。
【讨论】:
它没有帮助。 Cppcheck 在 CopyMemory 函数调用行仍然显示错误。【参考方案2】:我是一名 Cppcheck 开发人员。警告可能是错误的,但当我无法重现时很难说。
我希望您使用的是最新版本的 Cppcheck(1.84 是最新版本)。
默认的文本输出并没有说明为什么 Cppcheck 认为有一个 NULL 指针。你能试试--template=gcc
吗?你应该可以看到 Cppcheck 是如何得出有一个空指针的结论的。
最好的问候, Daniel Marjamäki
【讨论】:
我使用 1.84 进行了复制,即使使用了 template=gcc。有关代码,请参见我上面的答案(现在在下面)。以上是关于如何通过 Cppcheck 解释 Null 指针取消引用?的主要内容,如果未能解决你的问题,请参考以下文章