#c #memory-leaks
Вопрос:
При компиляции с помощью GCC средство очистки указывает на ошибку утечки памяти:
Direct leak of 10707 byte(s) in 347 object(s) allocated from:
#0 0xffff7f87432c in __interceptor_malloc ../../../../gcc-11.2.0/libsanitizer/asan/asan_malloc_linux.cpp:145
#1 0x417208 in dup_line (/opt/ncl/ni/src/nyacc/nyacc 0x417208)
#2 0x41bca4 in copy_action (/opt/ncl/ni/src/nyacc/nyacc 0x41bca4)
...
в следующей подпрограмме
char *
dup_line()
{
register char *p, *s, *t;
if (line == 0) return (0);
s = line;
while (*s != 'n') s;
p = MALLOC(s - line 1);
if (p == 0) no_space();
s = line;
t = p;
while ((*t = *s ) != 'n') continue;
return (p);
}
void
copy_action()
{
register int c;
register int i, n;
int depth;
int quote;
char *tag;
register FILE *f = action_file;
int a_lineno = lineno;
char *a_line = dup_line();
...
}
В подпрограмме dup_line чего — то не хватает или с ней что-то еще не так? Спасибо.
Комментарии:
1. Это говорит вам о том, что выделенная память
dup_line
никогда не передаваласьfree
. Вам нужно сделать это в какой-то момент позже в вашем коде, когда память больше не используется.2. Это не мой код, я просто пытаюсь его исправить. Как бы я выполнил ваше предложение?
3. Выясните, когда память больше не используется, а затем передайте указатель
free
на это время.4. После
char *a_line = dup_line();
,a
не указывает на строку , так как в данных отсутствует нулевой символ . Я подозреваю, что последующее использованиеa
приводит к UB.5. Не исправляйте это, так как я никогда в жизни не видел худшего кода. Все в глобальных переменных, какие-то странные макросы вроде
MALLOC
. Напишите программу с нуля.