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

时间:2015-03-06 18:18:19

标签: c cppcheck

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

#include <stdlib.h>

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

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

如果我删除了对func(p)的调用,那么cppcheck会检测到泄漏。

1 个答案:

答案 0 :(得分: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

我检查了change log for 1.69,有趣的是它说:

  

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

如果我使用new

,Cppcheck也会正确通知我内存泄漏
char* p = new char;
func(p);

如果我在func中释放内存,则没有错误:

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

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

如果我使用malloc进行分配并尝试在delete中使用func取消分配,则Cppcheck也会通知我mismatchAllocDealloc错误。