2

为什么cppcheck无法在像这个示例这样的程序中检测到内存泄漏,其中堆指针的所有权被传递给无法释放它的函数?

#include <stdlib.h>

void func(char *xx)
{
    // do nothing
}

int main(void)
{
    char *p = malloc(1000);
    func(p);
    return 0;
}

如果我删除调用func(p)然后 cppcheck 确实检测到泄漏。

4

1 回答 1

0

我正在使用Cppcheck 1.69,这正确地告诉我有内存泄漏。我有以下代码:

#include <stdlib.h>

void func(char *xx)
{
    // do nothing
}

int main(void)
{
    char *p = (char*)malloc(1000);
    func(p);
    return 0;
}

请注意,我已转换malloc为编译,但我尝试使用与您发布的完全相同的代码char*进行 Cppcheck,它仍然正确地告诉我存在内存泄漏。

当我运行时:

cppcheck main.cpp

我收到以下内容:

C:\Program Files (x86)\Cppcheck>cppcheck main.cpp
Checking main.cpp...
[main.cpp:12]: (error) Memory leak: p

我检查了1.69 的更改日志,有趣的是它说:

改进:
- 改进了缓冲区溢出和内存泄漏检查

如果我使用 Cppcheck 也会正确地通知我内存泄漏new

char* p = new char;
func(p);

如果我在func没有错误的情况下释放内存:

void func(char *xx)
{
    delete p;
}

int main(void)
{
    char* p = new char;
    func(p);
    return 0;
}

如果我用 in 分配malloc并尝试用deletein解除分配func,Cppcheck 也会通知我一个mismatchAllocDealloc错误。

于 2015-07-28T04:48:28.443 回答