Valgrind условный прыжок или перемещение зависит от неинициализированного значения(ов), указывает ли это на утечку памяти?

я сталкиваюсь с проблемой утечки памяти в коде, во время его работы куча продолжает увеличиваться до максимума, и мне нужно перезапустить службу, я запустил команду top и вижу, что куча увеличивается всякий раз, когда я вызываю сценарий в службе.

Я побежал в сервис с Valgrind ,

valgrind  --log-file=log-feb19.txt --leak-check=full --show-reachable=yes --track-origins=yes myservice

Я не вижу каких-либо определенно потерянных или, возможно, потерянных блоков во время выполнения IAM сценариев, но я вижу, что много условных прыжков или перемещений зависит от неинициализированного значения) ошибки.

Они считаются за утечку памяти?

пример того, что я получаю:

==27278== Conditional jump or move depends on uninitialised value(s)

==27278==    at 0xC90D91E: xcsFreeMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so)

........

==27278==  Uninitialised value was created by a heap allocation

==27278==    at 0x4A078B8: malloc (vg_replace_malloc.c:270)

==27278==    by 0xC90E32F: xcsGetMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so)

может кто-то помочь.

3 ответов


нет, это означает, что вы обращаетесь к памяти, которая не была инициализирована:

int main()
{
     int unitialized;
     std::cout << unitialized << std::endl;
}

вызовет эту ошибку.

немного более распространенным было бы:

struct X 
{
     X() : i(42) { }
  private:
     int i;
     int* forgotten; // oops, not initialized
};

наконец, это часто происходит с кодом на основе malloc, когда вы не используете memset очистить весь буфер. Итак,

  1. malloc размер буфера m
  2. чтение (например, из сокета) n байт
  3. напишите M байтов в файл; (m-n) байты не имели бы был инициализирован

Это объясняется в руководстве пользователя Valgrind, в разделе 4.2.2. Использование неинициализированных значений:

сообщается об ошибке использования неинициализированного значения, когда программа использует значение, которое не было инициализировано - другими словами, не определено.

...

важно понять, что ваша программа может копировать вокруг мусорные (неинициализированные) данные сколько угодно. Если команда соблюдает это и отслеживает данные, но не жалуется. Жалоба выдается только тогда, когда ваша программа пытается использовать неинициализированный данные, которые могут повлиять на внешнюю видимость вашей программы поведение.


нет это не указывает на утечку памяти напрямую. Однако наличие условного скачка в зависимости от неинициализированной переменной может привести практически к чему угодно. Использование неинициализированных переменных в целом вызывает неопределенное поведение.