Проверка границ - Bounds checking
Эта статья включает в себя список общих Рекомендации, но он остается в основном непроверенным, потому что ему не хватает соответствующих встроенные цитаты.Март 2012 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
В компьютерное программирование, проверка границ это любой метод определения того, Переменная находится в пределах некоторых границы перед его использованием. Обычно он используется, чтобы убедиться, что число соответствует заданному типу (проверка диапазона) или что переменная используется в качестве множество индекс находится в пределах массива (проверка индекса). Неудачная проверка границ обычно приводит к генерации какого-то исключение сигнал.
Поскольку проверка границ при каждом использовании занимает много времени, это не всегда делается. Устранение проверки границ это оптимизация компилятора техника, исключающая проверку ненужных границ.
Проверка диапазона
Проверка диапазона - это проверка, чтобы убедиться, что число находится в пределах определенного диапазона; например, чтобы гарантировать, что значение, которое должно быть присвоено 16-битному целому числу, находится в пределах емкости 16-битного целого числа (т.е. проверка на соответствие обертывание ). Это не совсем то же самое, что проверка типа. Другие проверки диапазона могут быть более строгими; например, переменная для хранения номера календарного месяца может быть объявлена как принимающая только диапазон от 1 до 12.
Проверка индекса
Проверка индекса означает, что во всех выражения При индексировании массива значение индекса проверяется на соответствие границам массива (которые были установлены, когда массив был определен), и, если индекс выходит за границы, дальнейшее выполнение приостанавливается из-за какой-то ошибки. Поскольку чтение или особенно запись значения за пределами массива может привести к сбою в работе программы или ее сбою или появлению уязвимостей безопасности (см. переполнение буфера ), проверка индекса является частью многих языки высокого уровня.
Паскаль, Фортран и Java имеют возможность проверки индексов. В VAX В компьютере есть инструкция сборки INDEX для проверки индекса массива, которая принимает шесть операндов, каждый из которых может использовать любой режим адресации VAX. B6500 и аналогичные Берроуз компьютеры выполняли связанную проверку с помощью оборудования, независимо от того, какой компьютерный язык был скомпилирован для создания машинного кода. Ограниченное количество позже Процессоры есть специализированные инструкции для проверки границ, например, инструкция CHK2 на Motorola 68000 серии.
Много языки программирования, Такие как C, никогда не выполняйте автоматическую проверку границ для увеличения скорости. Однако это оставляет много отдельные ошибки и переполнение буфера непойманный. Многие программисты считают, что эти языки слишком многим жертвуют ради быстрого выполнения.[1] В его 1980 Премия Тьюринга лекция К. А. Р. Хоар описал свой опыт в разработке АЛГОЛ 60, язык, который включает проверку границ, говоря:
Следствием этого принципа является то, что каждое вхождение каждого нижнего индекса каждой переменной с нижним индексом каждый раз проверялось во время выполнения как по верхней, так и по нижней объявленным границам массива. Много лет спустя мы спросили наших клиентов, не хотят ли они, чтобы мы предоставили возможность отключать эти проверки в интересах эффективности производственных циклов. Они единодушно призвали нас не делать этого - они уже знали, как часто возникают ошибки индекса в производственных циклах, когда их не обнаружение может иметь катастрофические последствия. Я со страхом и ужасом отмечаю, что даже в 1980 году разработчики и пользователи языков не усвоили этот урок. В любой респектабельной области техники несоблюдение таких элементарных мер предосторожности уже давно было бы нарушением закона.
Основные языки, обеспечивающие проверку времени выполнения, включают Ада, C #, Haskell, Ява, JavaScript, Лисп, PHP, Python, Рубин, и Visual Basic. В D и OCaml в языках есть проверка границ времени выполнения, которая включается или отключается переключателем компилятора. В C ++ проверка времени выполнения - это не часть языка, а часть STL и включается переключателем компилятора (_GLIBCXX_DEBUG = 1 или _LIBCPP_DEBUG = 1). C # также поддерживает небезопасные регионы: разделы кода, которые (среди прочего) временно приостанавливают проверку границ для повышения эффективности. Они полезны для ускорения небольших критических по времени узких мест без ущерба для безопасности всей программы.
В JS ++ язык программирования может анализировать, выходит ли индекс массива или ключ карты за границы во время компиляции, используя существующие типы, который является номинальный тип описывает, находится ли индекс или ключ в пределах или вне границ, и направляет генерацию кода. Было показано, что существующие типы добавляют к времени компиляции только 1 мсек.[2]
Проверка границ оборудования
Безопасность, добавленная проверкой границ, обязательно требует времени процессора, если проверка выполняется программно; однако, если проверки могут выполняться аппаратными средствами, безопасность может быть предоставлена «бесплатно» без затрат времени выполнения. Ранняя система с проверкой границ оборудования была ICL 2900 серии мэйнфрейм анонсирован в 1974 году.[3] По крайней мере, с 2005 года ведутся исследования методов использования встроенного модуля управления виртуальной памятью x86 для обеспечения безопасности доступа к массивам и буферам.[4] В 2015 году Intel предоставила свои Intel MPX расширения в их Skylake Архитектура процессора, которая хранит границы в регистре ЦП и таблице в памяти. По состоянию на начало 2017 года как минимум GCC поддерживает расширения MPX.
Смотрите также
Рекомендации
- ^ Коуэн, К; Wagle, F; Calton Pu; Битти, S; Уолпол, Дж (1999). «Переполнение буфера: атаки и защита уязвимости десятилетия». Материалы конференции и выставки по информационной живучести DARPA. DISCEX'00. 2. С. 119–129. Дои:10.1109 / DISCEX.2000.821514. ISBN 978-0-7695-0490-2.
- ^ "JS ++ 0.9.0: Эффективный анализ ошибок, выходящих за рамки установленных ограничений, во время компиляции - блог JS ++". Архивировано из оригинал на 2019-01-12.
- ^ Дж. К. Бакл (1978). Серия ICL 2900 (PDF). Серия Macmillan Computer Science. С. 17, 77. ISBN 978-0-333-21917-1. Получено 20 апреля 2018.
- ^ Лап-Чунг Лам; Ци-Чкер Чиу (2005). «Проверка нарушения границ массива с помощью оборудования для сегментации». 2005 Международная конференция по надежным системам и сетям (DSN'05). С. 388–397. Дои:10.1109 / DSN.2005.25. ISBN 0-7695-2282-3.
внешняя ссылка
- “О преимуществах архитектуры с тегами ”, IEEE Transactions on Computers, Volume C-22, Number 7, July 1973.
- “Старая одежда императора ”, Лекция по Премии Тьюринга ACM 1980 г., том 24 CACM, номер 2, февраль 1981 г., стр. 75–83.
- «Скрытая копия: проверка времени выполнения для программ C», С. К. Кендалл, Труды USENIX Летняя конференция 1983 г.
- “Проверка границ для C », Ричард Джонс и Пол Келли, Имперский колледж, июль 1995 года.
- “Серверы ClearPath Enterprise Servers Обзор безопасности MCP ”, Unisys, апрель 2006 г.
- “Безопасная виртуальная архитектура: безопасная среда выполнения для массовых операционных систем ”, Джон Крисвелл, Эндрю Ленхарт, Динакар Дурджати, Викрам Адве, 21-й симпозиум ACM по принципам операционных систем, SOSP'07, 2007.
- “Отказоустойчивый C », Ютака Оива. Реализация безопасного для памяти полного компилятора ANSI-C. Конференция ACM SIGPLAN по проектированию и реализации языков программирования (PLDI2009), июнь 2009 г.
- “адрес-дезинфицирующее средство », Тимур Исходжанов, Александр Потапенко, Алексей Самсонов, Костя Серебряный, Евгений Степанов, Дмитрий Вьюков, LLVM Dev Meeting, 18 ноября 2011 г.
- Безопасная библиотека ограниченных API на языке C
- "Библиотека Safe C". Журнал доктора Добба. 20 февраля 2009 г. Архивировано с оригинал 2 декабря 2013 г.. Получено 13 ноября, 2012.
- Safe C API - Краткое решение проблемы переполнения буфера, Фонд OWASP, OWASP AppSec, Пекин, 2011 г.
- Макросы руководства библиотеки GNU C ++
- Документация по libc ++ 11.0 Режим отладки