Есть ли у компилятора Intel C ++ проверка границ?

Мне было интересно, есть ли у компилятора Intel C ++ проверка границ? Я работаю с тоннами кода, развивающегося уже десять лет, и отчаянно нуждаюсь в отладке и рефакторинге. Мне нужна любая помощь.


person Srki    schedule 01.11.2010    source источник


Ответы (3)


В компиляторе Intel есть несколько вариантов проверки границ. Например.

check-указатели, Qcheck-указатели Определяет, проверяет ли компилятор границы доступа к памяти с помощью указателей.

http://software.intel.com/sites/products/documentation/doclib/iss/2013/compiler/cpp-lin/GUID-35036DDA-62B4-402F-8A21-1201C2706BF3.htm

person Krazy Glew    schedule 04.08.2013
comment
Связанная новая функция: software.intel.com/ en-us / article / - person Nemo; 04.04.2018

Массивы C принципиально нарушены таким образом, вы не можете надежно проверить их границы. Компилятор тоже. Однако компилятор Intel C ++, безусловно, может скомпилировать векторный класс. Включите отладку итератора, используйте метод доступа at ().

person Hans Passant    schedule 01.11.2010
comment
Неверно сказать, что вы не можете надежно ограничить проверочные массивы C. Если вы хотите ограничиться переносимым кодом C, совместимым со стандартами, то доступ за пределы массива не определен, поэтому компилятор или среда выполнения могут сигнализировать об ошибках. Вы должны разрешить указателям иметь такие значения, как array [-1] или array [size] (один элемент за любым концом), но вы можете поймать ловушку при разыменовании их. - person Krazy Glew; 16.07.2017
comment
Указатели Qcheck компилятора C Intel делают это. Есть даже аппаратная поддержка Intel MPX (Memory Protection eXtensions), которая должна сделать это быстрее. (Я сказал, что должен, потому что Intel нарушила мой первоначальный дизайн того, что стало MPX, в результате чего он часто работал медленнее, чем без использования инструкций MPX. Я могу только надеяться, что это будет исправлено в будущем.) - person Krazy Glew; 16.07.2017
comment
Ключ к такой проверке указателя на C состоит в том, что всякий раз, когда вы берете адрес объекта, вы связываете границы с этим адресом. Компилятор Intel, проверяющий указатель, и хранилище MPX, которое ограничивается специальными регистрами внутри ЦП и специальной несмежной структурой данных, доступ к которой по существу осуществляется путем поиска по хешу адреса указателя в памяти. Я назвал это несмежными жирными указателями.) Он полностью совместим с переносимым кодом C, выполняя все наборы проверочных тестов. Он даже обнаружил ошибки в тестах SPEC, о которых мы не знали. - person Krazy Glew; 16.07.2017
comment
Да, есть код на языке C, который нарушает правила. Компилятор проверки указателя Intel и MPX часто выявляют ошибки в таком коде, которые легко исправить. Более того, удивительно большое количество такого кода все равно выполняется, потому что на самом деле он не вызывает переполнения буфера. - person Krazy Glew; 16.07.2017
comment
Я думаю, что довольно точно сказать, что проблема проверки границ в C и C ++ может быть решена с помощью чего-то вроде компилятора проверки указателя Intel, если вы можете согласиться с затратами на производительность. И что лучшая версия аппаратной поддержки Intel MPX может значительно снизить эти затраты. - person Krazy Glew; 16.07.2017
comment
С другой стороны, проблемы с ВРЕМЕННОЙ памятью сложнее. Например. обнаружение ошибок использования после освобождения или двойного освобождения. Я не хотел обрабатывать их в версии 1.0 того, что стало Intel MPX, потому что, насколько я могу судить, все решения проблем с временной памятью в конечном итоге требуют морального эквивалента сборки мусора. Чтобы решить эту проблему, требуется время выполнения. Поддержка оборудования может удешевить, например требовать совпадения номеров версий объекта и указателя (то есть прозрачной версии versioned_ptr ‹T›, которую я отправил в Boost, но в конечном итоге необходимо обработать перенос номера версии. - person Krazy Glew; 16.07.2017

Если вы работаете в Linux или OS X, valgrind может помочь вам найти ошибки, связанные с доступом к памяти. Он не поддерживает C ++, поэтому сопоставление его вывода с вашим кодом может потребовать небольшой работы.

person bew    schedule 01.11.2010