fsanitize с gcc вызывает неожиданный ранний выход - PullRequest
0 голосов
/ 18 сентября 2018

У меня ошибка , которая не всегда воспроизводима , где free() вызывается для недопустимого указателя кучи. Снижение этой проблемы до «минимальной» принципиально невозможно с рассматриваемым кодом - (как только я это сделаю, она решена). Я не могу обнаружить какие-либо очевидные проблемы (например, потенциальный случай, когда calloc никогда не вызывается, или двойное освобождение и т. Д ...)

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

Это оставляет меня с fsanitize=address, я полагаю? Мой опыт с этим был ... не велик.

У меня есть две статические библиотеки и исполняемый файл, который связывается с ними. Я включил fsanitize=address для всех трех из них. При -fsanitize=address код полностью выходит из-под отладчика во время очень тщательно протестированной и правильной процедуры инициализации (в середине 256-байтового memcpy в распределении кучи 16 Мб - код выхода 1) .

Может ли кто-нибудь с практическим опытом использования fsanitize дать мне какие-либо советы о том, где может быть проблема? Я использую gcc / ld под cmake, и код (в основном) C скомпилирован с C ++. Переключение на clang - это, вероятно, вариант, если это может улучшить ситуацию.

Типичная команда компиляции для файла:

"command": "/usr/bin/c++   -I. -I/home/redacted -fpermissive -g -g3 -fasynchronous-unwind-tables -fsanitize=address   
-std=gnu++11 -o core/CMakeFiles/nginx_core.dir/src/core/nginx.cpp.o -c /home/redacted.cpp",

1 Ответ

0 голосов
/ 18 сентября 2018

Я просто оставлю это здесь для будущих поисковиков, имеющих проблемы с fsanitize. tldr; - сработало . У меня было две фундаментальные проблемы:

  1. fsanitize выводил исчерпывающую информацию об ошибке о причине выхода. Это было поглощено nginx ... и в нашей настроенной версии оно было перенаправлено в неизвестный файл журнала. Не уверен, почему под gdb я не получил отладочный перерыв, но тем не менее ... он обнаружил законную ошибку. Ключевая информация здесь: установка точки останова в __asan_report_error остановит программу перед выходом, чтобы вы могли проверить свои различные кадры.

  2. Хотя процедура инициализации является правильной и тщательно протестированной, как я уже говорил, она требует от своего клиента правильного размещения (нетривиальной) структуры конфигурации. В этом случае структура была заполнена на 1 байт, что привело к перечитыванию 1 байта.

...