Справочное руководство по Ada 2005
11.5 Отключение проверок
Директивы проверки предоставляют инструкции реализации по обработке определенных языком проверок. Директива Suppress разрешает реализации опускать определенные проверки, заданные языком, в то время как директива Unsuppress отменяет разрешение на опускание проверок.
Языковая проверка (или просто «проверка») — это одна из ситуаций, определенных в данном международном стандарте, которая требует выполнения проверки во время выполнения, чтобы определить, истинно ли какое-либо условие. Проверка не проходит, когда проверяемое условие ложно, что приводит к возбуждению исключения.
Синтаксис
Формы директив проверки следующие:
pragma Suppress(идентификатор);
pragma Unsuppress(идентификатор);
Директива проверки допускается только непосредственно внутри части_объявления, непосредственно внутри спецификации_пакета или в качестве конфигурационной директивы.
Правила допустимости
Идентификатор должен быть именем проверки.
Этот абзац был удален.
Статическая семантика
Директива проверки применяется к указанной проверке в определенной области и применяется ко всем сущностям в этой области. Директива проверки, заданная в части_объявления или непосредственно внутри спецификации_пакета, применяется от места директивы до конца самого внутреннего охватывающего региона объявлений. Область для директивы проверки, заданной как конфигурационная директива, представляет собой область объявлений для всего (или всех) модулей компиляции, к которым она применяется.
Если директива проверки применяется к экземпляру обобщения, то директива проверки также применяется к экземпляру. Если директива проверки применяется к вызову подпрограммы, к которой применена директива Inline, то директива проверки также применяется к вставленному телу подпрограммы.
Директива Suppress разрешает реализации опустить указанную проверку (или все проверки в случае All_Checks) для любых сущностей, к которым она применяется. Если разрешено опустить определенную проверку, то говорят, что проверка отключена.
Директива Unsuppress отменяет разрешение на опускание указанной проверки (или всех проверок в случае All_Checks), предоставленное любой директивой Suppress, которая применяется в точке директивы Unsuppress. Разрешение отменяется для области, к которой применяется директива Unsuppress. Если в точке директивы Unsuppress такого разрешения нет, то директива не оказывает никакого эффекта. Более поздняя директива Suppress может возобновить разрешение.
Ниже перечислены языковые проверки:
- Следующие проверки соответствуют ситуациям, в которых исключение Constraint_Error возбуждается при неудаче.
Access_Check
При вычислении разыменования (явного или неявного), проверка того, что значение имени не равно null. При преобразовании в подтип, исключающий null, проверка того, что преобразованное значение не равно null.
Discriminant_Check
Проверка того, что дискриминанты составного значения имеют значения, наложенные ограничением дискриминанта. Кроме того, при обращении к элементу записи проверяется, существует ли он для текущих значений дискриминантов.
Division_Check
Проверка того, что второй операнд не равен нулю для операций /, rem и mod.
Index_Check
Проверка того, что границы массива соответствуют соответствующим границам ограничения индекса. Также при обращении к элементу объекта массива для каждого измерения проверяется, принадлежит ли данное значение индекса диапазону, определенному границами объекта массива. Кроме того, при обращении к срезу объекта массива проверяется, что заданный дискретный диапазон совместим с диапазоном, определяемым границами объекта массива.
Length_Check
Проверка того, что два массива имеют соответствующие компоненты в случае преобразования типов массивов и логических операторов для массивов из boolean-компонентов.
Overflow_Check
Проверка того, что скалярное значение находится в базовом диапазоне своего типа в тех случаях, когда реализация выбирает возбуждение исключения вместо возврата правильного математического результата.
Range_Check
Проверка того, что скалярное значение удовлетворяет ограничению диапазона. Кроме того, для разработки указание_подтипа проверка того, что ограничение (если оно присутствует) совместимо с подтипом, обозначенным меткой_подтипа. Также для агрегата проверка того, что значение индекса или дискриминанта принадлежит соответствующему подтипу. Кроме того, проверка того, что, когда операция приводит к массиву, значение каждого компонента принадлежит подтипу компонента.
Tag_Check
Проверка того, что теги операндов в вызове диспетчеризации все равны. Проверка правильного тега при преобразовании типов помеченных типов, для оператора_присваивания и при возвращении помеченного ограниченного объекта из функции.
- Следующие проверки соответствуют ситуациям, в которых исключение Program_Error возбуждается при неудаче.
Accessibility_Check
Проверка уровня доступа к сущности или представлению.
Allocation_Check
Для аллокатора проверка того, что мастер любых задач, которые должны быть созданы аллокатором, еще не завершен или некоторые зависимые задачи еще не завершены, и что окончание коллекции еще не началось.
Elaboration_Check
При вызове подпрограммы или защищенной записи, выполнении активации задачи или разработке экземпляра обобщения проверяется, что тело соответствующего блока уже разработано.
Этот абзац был удален.
- Следующая проверка соответствует ситуациям, в которых при неудаче возбуждается исключение Storage_Error.
Storage_Check
Проверка того, что вычисление аллокатора не требует больше места, чем доступно для пула памяти. Проверка того, что доступное место для задачи или подпрограммы не превышено.
- Следующая проверка соответствует всем ситуациям, в которых возбуждается любое предопределенное исключение.
All_Checks
Представляет собой объединение всех проверок; отключение All_Checks отключает все проверки.
Ошибочное выполнение
Если данная проверка отключена, а соответствующая ошибка возникает, выполнение программы является ошибочным.
Разрешения реализации
Реализация имеет право устанавливать ограничения на директивы проверки, подчиняясь только требованию, что директива Unsuppress должна позволять любые имена проверок, поддерживаемые директивой Suppress. Реализация имеет право добавлять дополнительные имена проверок с определенными реализацией семантиками. При отключении Overflow_Check реализация также может отключить неопределенный подмножество проверок Range_Checks.
Реализация может поддерживать дополнительный параметр в директиве Unsuppress, аналогичный тому, что разрешен для директивы Suppress (см. J.10). Значение такого параметра определяется реализацией.
Рекомендации для реализации
Реализация должна минимизировать код, выполняемый для проверок, которые были отключены.
ПРИМЕЧАНИЯ
3 Нет гарантии, что подавленная проверка будет фактически удалена; поэтому псевдоним pragma Suppress следует использовать только по соображениям эффективности.
4 Можно задать как pragma Suppress, так и Unsuppress для одной и той же проверки непосредственно в той же declarative_part. В этом случае последняя заданная pragma определяет, подавлена ли проверка. Аналогично, можно повторно подавить проверку, которая была снята с подавления, задав pragma Suppress во внутреннем декларативном блоке.
Примеры
Примеры подавления и снятия подавления проверок:
pragma Suppress(Index_Check);
pragma Unsuppress(Overflow_Check);
pragma Unsuppress(Overflow_Check);