Включить AddressSanitizer по умолчанию в gcc
Чтобы иметь возможность отлаживать и использовать весь дистрибутив Linux, я хотел бы установить ASAN (AddressSanitizer, https://en.wikipedia.org/wiki/AddressSanitizer) в качестве опции по умолчанию для gcc. Поэтому обычно для достижения того, чего я хочу, обычно я устанавливаю следующие переменные перед тем, как скомпилировать пакет linux:
CFLAGS="-fsanitize=address,undefined -Wformat -Werror=format-security -Werror=array-bounds -g"
CXXFLAGS="-fsanitize=address,undefined -Wformat -Werror=format-security -Werror=array-bounds -g"
LDFLAGS="-fsanitize=address,undefined"
и попробуйте скомпилировать и запустить мой код. Я хотел бы иметь его по умолчанию для GCC.
Для этого можно использовать файлы спецификаций: https://gcc.gnu.org/onlinedocs/gcc/Spec-Files.html. Однако я не нашел способа установить "все правила" для компиляции и связывания всего моего кода на c / C++ с AddressSanitizer.
Мои вопросы:
- Любой пример, как это сделать, используя спецификации файлов?
- Это лучший подход для этого?
- Любой другой альтернативный подход?
1 ответ
Прежде всего, обязательно взгляните на существующие целые дистрибутивы Asan в Tizen (также здесь) и Gentoo.
В целом существует два основных подхода:
- настройте свою систему сборки так, чтобы она включала Asan по умолчанию, обычно используя
CFLAGS
а такжеCXXFLAGS
; это не всегда будет работать, потому что многие пакеты игнорируют их (я думаю, это то, что Ханно Бек сделал в Gentoo) - замещать
/usr/bin/gcc
,/usr/bin/g++
а также/usr/bin/cc
(и можетx86_64-linux-gnu-gcc
,x86_64-linux-gnu-g++
) с обертками, которые добавят флаги Asan и перенаправят вызовы к исходным исполняемым файлам (это подход, который мы в конечном итоге использовали в Tizen и нашли его очень успешным)
Как примечание, я бы предложил добавить следующие параметры
CFLAGS += -fsanitize-recover=address,undefined
в противном случае загрузка завершится неудачно на слишком ранних этапах. Также посмотрите на предлагаемые настройки ASAN_OPTIONS
в приведенных выше ссылках людям потребовалось много времени, чтобы понять их.