Использование UBSan и Asan с GCC 4.9.2

Я скомпилировал свою заявку с -fsanitize=undefined вариант. Как я могу теперь проверить свое приложение на неопределенное поведение?

Кроме того, как я могу запустить проверку Asan? Я собрал свою программу с -fsanitize=addressи вылетает со следующим выводом:

==4563==Sanitizer CHECK failed: ../../../../src/libsanitizer/asan/asan_malloc_linux.cc:85 ((allocated < kCallocPoolSize)) != (0) (0, 0)

У меня есть GCC 4.9.2 на Ubuntu 15.04.

0

Решение

В отличие от проверки статического анализа, эта проверка будет выполняться во время выполнения, как описано в следующей записи блога: GCC Неопределенное дезинфицирующее средство для поведения — UBSAN. Он выдаст ошибку времени выполнения при обнаружении неопределенного поведения:

Чтобы проверить вашу программу с помощью UBSAN, скомпилируйте и свяжите
программа с опцией -fsanitize = undefined. Такие инструментальные бинарные файлы
должны быть выполнены; Если UBSAN обнаруживает какие-либо проблемы, он выводит
Сообщение об ошибке во время выполнения и в большинстве случаев продолжает выполнять
программа. Есть возможность сделать эти диагностические сообщения
прервать — просто используйте опцию -fno-sanitize-recovery.

И мы можем увидеть пример оттуда:

int main() {
int i = 23;
i <<= 32;
}

когда побежал с помощью -fsanitize=undefined будет выводить (увидеть это в прямом эфире):

ошибка времени выполнения: показатель 32 сдвига слишком велик для 32-битного типа int

GCC документирует эту опцию в своих Варианты отладки вашей программы или раздела GCC и это говорит:

Включите UndefinedBehaviorSanitizer, быстрый детектор неопределенного поведения.
Различные вычисления используются для обнаружения неопределенного поведения при
во время выполнения.

Что касается вопроса Асан это адресный дезинфицирующий документ дает вам пример и ожидаемые результаты. Возможно, ваш случай это связано с эта ошибка GCC.

3

Другие решения