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