У меня ошибка , которая не всегда воспроизводима , где 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",