В противоположность Heisenbug, ошибка сегментации, которая появляется ТОЛЬКО при отладке, но программа работает нормально - PullRequest
0 голосов
/ 13 марта 2020

Я написал простую C программу с двумя структурами данных, реализованными как ADT, поэтому я динамически распределяю память для них

Все работало нормально, пока я не решил добавить int значение внутри структуры, ничего динамически не распределяется, classi c обычный старый простой stati c выделение памяти, но с тех пор, как я его добавил, у меня начался segfault в довольно безопасной функции, которая вообще не должна быть segfault.

Я думал об ошибке выделения памяти, поэтому я пытался не освобождать и повторно использовать переменную-указатель, которую я использовал, а вместо этого использовать другую переменную, и программа работала нормально. Разозленный тем, что мне приходилось сталкиваться с подобными ошибками, я снова включил бесплатное, о котором говорил ранее, перекомпилировал и пробежал с valgrind.

К моему удивлению, было абсолютно нет утечки памяти, нет ошибки сегментации, нет каких-либо прерываний, просто предупреждение о Conditional jump or move depends on uninitialised value(s), но это требуемое поведение (if (pointer == NULL) { }), поэтому я запустил исполняемый файл непосредственно из командной строки, и снова все прошло нормально, поэтому ситуация такова:

Программа без нового значения int в структуре:

  • Компиляция: проверка
  • Выполнения: проверка
  • Valgrind анализ: утечки памяти нет, только предупреждение
  • Debug (gdb): check

Программа с новым значением int в структуре:

  • Compile : check
  • Запускается: check
  • Анализ Valgrind: нет утечки памяти, только предупреждение
  • Отладка (GDB): Segfault

Итак, я думаю, что это противоположность Heisenbug, ошибка, которая показывает себя только и абсолют только при отладке, как я могу это исправить?

1 Ответ

0 голосов
/ 13 марта 2020

Хорошо, благодаря @ weather-vane и @ some-programmer-dude, я заметил, что фактически я не инициализировал переменную, на которую жалуется valgrind, и неправильно понял предупреждение valgrind, я читал его как You should not use a if to check if variables are NULL

...