Проверка границ массива во время выполнения в C ++, построенная с помощью g ++ - PullRequest
19 голосов
/ 18 февраля 2010

Есть ли способ выполнить проверку границ массивов в C ++, скомпилированном с использованием g++?

В идеале исходный код никоим образом не должен изменяться. Использование std::vector, std::tr1::array или boost::array не вариант, потому что кодовая база велика и такой сдвиг был бы невозможен.

Ответы [ 3 ]

8 голосов
/ 14 июля 2013

Google's AddressSanitizer - это инструментальный модуль компилятора и библиотека времени выполнения, которая может проверять, помимо прочего, внешний доступ к куче, стеку и глобальным переменным.Он доступен в Clang 3.1 + и в GCC 4.8 + .

Чтобы использовать его, передайте -fsanitize=address (или -faddress-sanitizer в старом Clang 3.1) средиаргументы компилятору и компоновщику (ссылки asan; нет необходимости в явном -lasan).Чтобы получить более качественные следы стека в сообщениях об ошибках, передайте компилятору -fno-omit-frame-pointer.

Первоначально он использовался для тестирования Chromium, а с 2012 года , используется разработчиками Firefox тоже.Есть хорошее сообщение в блоге о том, как запустить его с Qt .Вы также можете прочитать больше контекста в Википедии .

6 голосов
/ 18 февраля 2010

Существует инструмент Valgrind с именем SGCheck (ранее известный как Ptrcheck), который проверяет переполнение границ массива стека.

valgrind --tool=exp-sgcheck <program> <arguments>

Инструмент все еще помечен как экспериментальный и имеет несколько ограничений . Один из них:

Платформы: стек / глобальные проверки не будут работать должным образом на PowerPC, ARM или платформы S390X, только на мишенях X86 и AMD64. Это потому что стек и глобальная проверка требуют отслеживания вызовов функций и выходов надежно, и нет очевидного способа сделать это на ABI, которые используют ссылку зарегистрироваться для возврата функции.

1 голос
/ 31 июля 2012

GCC mudflap (-fmudflap) может выполнять проверку границ для C, но не может обрабатывать весь код C ++ по состоянию на середину 2012 года (например, std::vector). Он был удален в GCC 4.9 в середине 2015 года, заменен Address Sanitizer. Варианты «грязевого крыла» остаются, но ничего не делают.

Имеется патч MIRO - M udflap I m, подтвержденный R eferent O bjects. См. домашнюю страницу для получения дополнительной информации. Также есть бумага об этом .

Я кратко попробовал MIRO. Кажется, это очень хорошо, но, возможно, не будет работать со 100% кода C ++. Я намерен использовать MIRO во время разработки, а затем отключить его (и использовать обычный компилятор) для выпуска. Если вы пишете свой собственный код, его будет довольно легко заставить работать с MIRO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...