2015-08-04 6 views
0

Я скомпилировал свое приложение с опцией -fsanitize=undefined. Как я могу проверить приложение на неопределенное поведение?Использование UBSan и Asan с GCC 4.9.2

Также, как я могу запустить проверку Асана? Я собрал свою программу с -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

Проблема с asan, поскольку мой обновленный ответ говорит, выглядит как ошибка, но я не смог найти конкретный, который точно соответствует. Лучше всего, вероятно, подать отчет об ошибке с конкретным тестовым случаем. Если бы вы могли указать тестовый пример, в котором этот вопрос терпит неудачу, это было бы более полезно. –

ответ

2

В отличие от проверки статического анализа, эта проверка будет выполнена во время выполнения, как описано в следующей записи в блоге: GCC Undefined Behavior Sanitizer – ubsan. Он будет выдавать сообщение об ошибке выполнения, когда он обнаруживает неопределенное поведение:

In order to check your program with ubsan, compile and link the program with -fsanitize=undefined option. Such instrumented binaries have to be executed; if ubsan detects any problem, it outputs a “runtime error:” message, and in most cases continues executing the program. There is a possibility of making these diagnostic messages abort — just use the option -fno-sanitize-recover.

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

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

когда бегал с использованием -fsanitize=undefined выхода будут (see it live):

runtime error: shift exponent 32 is too large for 32-bit type 'int'

GCC документирует этот вариант в своем Options for Debugging Your Program or GCC section, и он говорит:

Enable UndefinedBehaviorSanitizer, a fast undefined behavior detector. Various computations are instrumented to detect undefined behavior at runtime.

Что касается вопроса асана, то этот address-sanitizer document дает вам пример и ожидаемые результаты. Возможно, ваш случай связан с this gcc bug.

+0

Этот пример отлично работает, но если мое приложение касается, UBSan ничего не выводит. Кроме того, мне иногда нужно принудительно связывать его (-lubsan) для моего приложения, в то время как оно не требуется для вашего образца ... – Ilya

+0

@ Илья вы попробовали вставить код, который знал неопределенное поведение, такое как пример выше, чтобы увидеть, есть ли в по крайней мере, что помечено? Если нет, это звучит как проблема с дистрибутивом или проблема с установкой, но она начинает удаляться от исходного вопроса. * Как я могу проверить приложение на неопределенное поведение? *. В быстром сканировании в Интернете ничего не видно. –

+0

Ну, я нашел способ успешной компиляции без -lubsan. Теперь я использую -fsanitize = undefined при компоновке, а не в компиляции. Однако даже очевидные проблемы не сообщаются (например, int i = 23; i << = 32;). Мое приложение имеет графический интерфейс; может это проблема? – Ilya