Проверка границ массива Runtime в С++, построенная с помощью g++

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

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

Ответы

Ответ 1

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

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

Инструмент по-прежнему помечен как экспериментальный, и он поставляется с несколькими limitations. Один из них:

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

Ответ 2

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

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

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

Ответ 3

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

Существует MIRO патч - исправление с использованием референтных объектов. Для получения дополнительной информации см. Его домашняя страница. Кроме того, есть документ об этом.

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