Как использовать AddressSanitizer в gcc?

Я пытаюсь построить свой проект с

g++ -O0 -g -fsanitize=address -fno-omit-frame-pointer

но сделать много ошибок, таких как:

/home/user/libs/opencv/include/opencv2/core/mat.hpp:715: undefined reference to `__asan_report_load8'

как скомпилировать проект с поддержкой AddressSanitize?

gcc -v

gcc версии 4.8.4

4 ответов


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


вам нужно добавить -fsanitize=address для обоих флагов компилятора (CFLAGS, CXXFLAGS) и компоновщика флаги (LDFLAGS). Вероятно, вы добавили его только в флаги компилятора.

обратите внимание, что вместо использования явного -lasan канонический способ-это добавить -fsanitize=address к вашим флагам компоновщика. Используя -lasan был широко обескуражен разработчиками ASan (например,здесь).

в качестве примечания, для более агрессивных флагов проверки проверьте ASAN FAQ.


убедитесь, что у вас установлен libasan. Например, в Fedora:

dnf install libasan libasan-static


- вы не должны связать с -lasan при использовании -fsanitize

я исправил ошибки asan, добавив дополнительные параметры fsanitize:

CFLAGS+="-fsanitize=address -fsanitize-recover=address -U_FORTIFY_SOURCE <br> -fno-omit-frame-pointer -fno-common"

LDFLAGS += -fsanitize=address

получил их по этой ссылке:

https://wiki.tizen.org/ASan#Using_manual_.spec_change