Справочник по Ada 95
11.5 Подавление проверок
pragma Suppress разрешает реализации пропускать определённые проверки, заданные языком.
Языковая проверка (или просто «проверка») — это одна из ситуаций, определённых этим международным стандартом, требующая выполнения проверки во время выполнения для определения истинности некоторого условия. Проверка не проходит, когда проверяемое условие ложно, что приводит к возбуждению исключения.
Синтаксис
Форма pragma Suppress выглядит следующим образом:
pragma Suppress(идентификатор [, [On =>] имя]);
pragma Suppress допускается только непосредственно внутри declarative_part, непосредственно внутри package_specification или как конфигурационный pragma.
Правила легальности
Идентификатор должен быть именем проверки. Имя (если присутствует) должно статически обозначать какой-либо сущность.
Для pragma Suppress, находящегося непосредственно внутри package_specification и включающего имя, имя должно обозначать сущность (или несколько перегруженных подпрограмм), объявленную непосредственно внутри package_specification.
Статическая семантика
pragma Suppress разрешает реализации пропускать указанную проверку с места расположения pragma до конца самого внутреннего окружающего декларативного региона или, если pragma приведено в package_specification и включает имя, до конца области действия указанной сущности. Если pragma включает имя, разрешение применяется только к проверкам, выполняемым над указанной сущностью или, для подтипа, над объектами и значениями его типа. В противном случае разрешение применяется ко всем сущностям. Если разрешение на подавление данной проверки предоставлено, то проверка считается подавленой.
Следующие проверки определены языком:
- Следующие проверки соответствуют ситуациям, в которых при неудаче возбуждается исключение Constraint_Error.
- Access_Check
- При вычислении разыменования (явного или неявного) проверяется, что значение имени не равно null. При передаче фактического параметра формальному параметру доступа проверяется, что значение фактического параметра не равно null. При вычислении discriminant_association для дискриминанта доступа проверяется, что значение дискриминанта не равно null.
- Discriminant_Check
- Проверка того, что дискриминанты составного значения имеют значения, налагаемые ограничением дискриминанта. Также при обращении к компоненту записи проверяется, что он существует для текущих значений дискриминантов.
- Division_Check
- Проверка того, что второй операнд не равен нулю для операций /, rem и mod.
- Index_Check
- Проверка того, что границы массива равны соответствующим границам ограничения индекса. Также при доступе к компоненту массива объекта для каждой размерности проверяется, что заданное значение индекса принадлежит диапазону, определённому границами массива объекта. Также при доступе к срезу массива объекта проверяется, что заданный дискретный диапазон совместим с диапазоном, определённым границами массива объекта.
- Length_Check
- Проверка того, что два массива имеют совпадающие компоненты в случае преобразований подтипов массивов и логических операторов для массивов булевых компонентов.
- Overflow_Check
- Проверка того, что скалярное значение находится в базовом диапазоне его типа в тех случаях, когда реализация выбирает возбуждение исключения вместо возвращения правильного математического результата.
- Range_Check
- Проверка того, что скалярное значение удовлетворяет ограничению диапазона. Также при разработке subtype_indication проверяется, что ограничение (если присутствует) совместимо с подтипом, обозначаемым subtype_mark. Также для aggregate проверяется, что значение индекса или дискриминанта принадлежит соответствующему подтипу. Также проверяется, что когда результат операции даёт массив, значение каждого компонента принадлежит типу компонента.
- Tag_Check
- Проверка того, что теги операндов в вызове диспетчеризации все равны. Проверка правильного тега при преобразованиях типов с метками, для assignment_statement и при возвращении помеченного ограниченного объекта из функции.
- Следующие проверки соответствуют ситуациям, в которых при неудаче возбуждается исключение Program_Error.
- Elaboration_Check
- При вызове подпрограммы или защищенной записи, активации задачи или разработке обобщенной инстанциации проверяется, что тело соответствующего модуля уже было разработано.
- Accessibility_Check
- Проверка уровня доступности сущности или представления.
- Следующая проверка соответствует ситуациям, в которых при неудаче возбуждается исключение Storage_Error.
- Storage_Check
- Проверка того, что оценка allocator не требует больше места, чем доступно для пула памяти. Проверка того, что доступное пространство для задачи или подпрограммы не превышено.
- Следующая проверка соответствует всем ситуациям, в которых возбуждается любое предопределённое исключение.
- All_Checks
- Представляет собой объединение всех проверок; подавление All_Checks подавляет все проверки.
Ошибка выполнения
Если заданная проверка была подавлена, и возникает соответствующая ситуация ошибки, выполнение программы является ошибочным.
Разрешения реализации
Реализация имеет право накладывать ограничения на pragma Suppress. Реализация имеет право добавлять дополнительные имена проверок с семантикой, определённой реализацией. Когда Overflow_Check был подавлен, реализация также может подавить неопределённый подмножество Range_Checks.
Рекомендации для реализации
Реализация должна минимизировать код, выполняемый для проверок, которые были подавлены.
ПРИМЕЧАНИЯ
2 Нет гарантии, что подавленная проверка фактически удалена; следовательно, pragma Suppress следует использовать только по соображениям эффективности.
Примеры
Примеры подавления проверок:
pragma Suppress(Range_Check);
pragma Suppress(Index_Check, On => Table);
pragma Suppress(Index_Check, On => Table);