Ошибка утечки памяти при динамическом выделении памяти

#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 . Напишите программу с нуля.