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 ответ

Я использую 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;
}

Если я выделю с malloc и попытаться освободить с delete в funcCppcheck также информирует меня о mismatchAllocDealloc ошибка.

Другие вопросы по тегам