Проверка границ массива 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.