Проверка границ

редактировать

В компьютерном программировании проверка границ - это любой метод определения того, находится ли переменная внутри некоторого границы перед его использованием. Обычно он используется для обеспечения того, чтобы число соответствовало заданному типу (проверка диапазона) или чтобы переменная, используемая в качестве индекса array, находилась в границах массива (проверка индекса). Неудачная проверка границ обычно приводит к генерации какого-либо сигнала исключения.

Поскольку проверка границ при каждом использовании занимает много времени, это не всегда делается. Устранение проверки границ - это метод оптимизации компилятора, который устраняет проверку ненужных границ.

Содержание
  • 1 Проверка диапазона
  • 2 Проверка индекса
  • 3 Проверка границ оборудования
  • 4 См. Также
  • 5 Ссылки
  • 6 Внешние ссылки
Проверка диапазона

Проверка диапазона - это проверка, чтобы убедиться, что число находится в определенном диапазоне; например, чтобы гарантировать, что значение, которое будет присвоено 16-битному целому числу, находится в пределах емкости 16-битного целого числа (т. е. проверка по циклическому ). Это не совсем то же самое, что проверка типов. Другие проверки диапазона могут быть более строгими; например, переменная для хранения числа календарного месяца может быть объявлена ​​как принимающая только диапазон от 1 до 12.

Проверка индекса

Проверка индекса означает, что во всех выражениях индексируя массив, значение индекса проверяется на соответствие границам массива (которые были установлены, когда массив был определен), и если индекс выходит за границы, дальнейшее выполнение приостанавливается из-за какой-то ошибки. Поскольку чтение или особенно запись значения за пределами массива может вызвать сбои в работе программы или привести к ее сбою или появлению уязвимостей безопасности (см. переполнение буфера ), проверка индекса является частью многих высокоуровневых языки.

Паскаль, Фортран и Java имеют возможность проверки индексов. Компьютер VAX имеет инструкцию сборки INDEX для проверки индекса массива, которая принимает шесть операндов, каждый из которых может использовать любой режим адресации VAX. B6500 и аналогичные компьютеры Burroughs выполняли проверку привязки через оборудование, независимо от того, какой компьютерный язык был скомпилирован для создания машинного кода. Ограниченное количество более поздних ЦП имеет специализированные инструкции для проверки границ, например, инструкция CHK2 в серии Motorola 68000.

Многие языки программирования, такие как C, никогда не выполняют автоматическую проверку границ для повышения скорости. Однако при этом многие отдельные ошибки и переполнение буфера остаются невыявленными. Многие программисты считают, что эти языки слишком многим жертвуют ради быстрого выполнения. В своей лекции Премии Тьюринга 1980 года К. А. Р. Хоар описал свой опыт разработки АЛГОЛА 60, языка, который включает проверку границ, сказав:

Следствием этого принципа является то, что каждое вхождение каждого нижнего индекса каждой индексируемой переменной было каждый раз проверяется во время выполнения на соответствие как верхней, так и нижней объявленным границам массива. Много лет спустя мы спросили наших клиентов, не хотят ли они, чтобы мы предоставили возможность отключать эти проверки в интересах эффективности производственных циклов. Они единодушно призвали нас не делать этого - они уже знали, как часто ошибки индексации возникают в производственных циклах, когда их неспособность обнаружить может иметь катастрофические последствия. Я со страхом и ужасом замечаю, что даже в 1980 году разработчики языков и пользователи не усвоили этот урок. В любой респектабельной области инженерии несоблюдение таких элементарных мер предосторожности уже давно было бы нарушением закона.

Основные языки, обеспечивающие проверку времени выполнения, включают Ada, C#, Haskell, Java, JavaScript, Lisp, PHP, Python, Ruby и Visual Basic. В языках D и OCaml есть проверка границ времени выполнения, которая включается или выключается переключателем компилятора. В C ++ проверка времени выполнения не является частью языка, а является частью STL и включается переключателем компилятора (_GLIBCXX_DEBUG = 1 или _LIBCPP_DEBUG = 1). C # также поддерживает небезопасные области: разделы кода, которые (среди прочего) временно приостанавливают проверку границ для повышения эффективности. Они полезны для ускорения небольших критических по времени узких мест без ущерба для безопасности всей программы.

Язык программирования JS ++ может анализировать, выходит ли индекс массива или ключ карты за границы во время компиляции, используя номинальный тип, описывающий независимо от того, находится ли индекс или ключ в пределах или вне границ и направляет генерацию кода. Было показано, что существующие типы увеличивают время компиляции только на 1 мс.

Проверка границ оборудования

Безопасность, добавленная проверкой границ, обязательно требует затрат времени ЦП, если проверка выполняется программно; однако, если проверки могут выполняться аппаратно, безопасность может быть предоставлена ​​«бесплатно» без затрат времени выполнения. Первой системой с проверкой аппаратных границ был мэйнфрейм ICL 2900 Series, анонсированный в 1974 году. По крайней мере, с 2005 года ведутся исследования методов использования встроенного модуля управления виртуальной памятью x86 для обеспечения безопасности массива и буфера. доступы. В 2015 году Intel представила свои расширения Intel MPX в архитектуре процессора Skylake, которая сохраняет границы в регистре ЦП и таблице в памяти. По состоянию на начало 2017 года как минимум GCC поддерживает расширения MPX.

См. Также
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-13 08:10:43
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте