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
в func
Cppcheck также информирует меня о mismatchAllocDealloc
ошибка.