Включить 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.

Мои вопросы:

  • Любой пример, как это сделать, используя файлы спецификаций?
  • Это лучший способ сделать это?
  • Любой другой альтернативный подход?

person VP.    schedule 16.02.2017    source источник


Ответы (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 по ссылкам выше, люди долго в них разбирались.

person yugr    schedule 18.02.2017
comment
привет, не могли бы вы указать мне пример оболочки gcc? Я нашел, например, github.com/gawen947/gcc-wrapper, который я мог бы изучить, однако если у вас уже есть что-то на примете, было бы лучше.. - person VP.; 19.02.2017
comment
@ВП. Ну, на самом деле это просто примитивная оболочка оболочки, которая вызывает настоящий gcc с -fanitize=address -fsanitize-recover=address -fno-common etc.. Оболочки Gcc — обычная практика (см., например, инструкции pbuilder), но я боюсь, нет ссылки на Асана. - person yugr; 19.02.2017
comment
Хорошо, я сделал что-то вроде export MYFLAGS=...; exec /usr/bin/gcc-6 $@ но это почему-то не сработало... спасибо за отличный вклад! - person VP.; 19.02.2017
comment
@ВП. К вашему сведению, я только что проверил статью о Tizen, в ней есть пример оболочки (рис. 5). Пожалуйста. - person yugr; 19.02.2017