Справочник по Ada 2012
13.9.1 Действительность данных
Некоторые действия, которые могут привести к ошибочному выполнению, не являются непосредственно ошибочными, но вместо этого могут привести к тому, что объекты станут ненормальными. Последующее использование ненормальных объектов может быть ошибочным.
Объект скалярного типа может иметь недопустимое представление, что означает, что представление объекта не представляет никакого значения подтипа объекта. Основной причиной недопустимых представлений являются неинициализированные переменные.
В этом подразделе объясняются ненормальные объекты и недопустимые представления.
Динамическая семантика
При первом создании объекта и выполнении всех явных или по умолчанию инициализаций объект и все его части находятся в нормальном состоянии. Последующие операции, как правило, оставляют их нормальными. Однако объект или часть объекта могут стать ненормальными следующими способами:
- Присваивание объекту прерывается из-за прерывания (см. 9.8) или из-за сбоя предопределенной проверки языка (см. 11.6).
- Объект не является скалярным и передается в параметр in out или out импортируемой процедуры, процедуре Read экземпляра Sequential_IO, Direct_IO или Storage_IO, или атрибуту потока T'Read, если после возврата из процедуры представление параметра не представляет значение подтипа параметра.
- Объект является возвращаемым объектом вызова функции нескалярного типа, а функция импортирована, является экземпляром Unchecked_Conversion или атрибутом потока T'Input, если после возврата из функции представление возвращаемого объекта не представляет значение подтипа функции.
Для импортируемого объекта программист отвечает за обеспечение того, чтобы объект оставался в нормальном состоянии.
Не указано, станет ли объект на самом деле ненормальным в этих случаях. Ненормальный объект снова становится нормальным после успешного выполнения присваивания объекту в целом.
Ошибочное выполнение
Ошибочно вычислять основное выражение, которое является именем, обозначающим ненормальный объект, или вычислять префикс, обозначающий ненормальный объект.
Ограниченные (временные) ошибки
Если представление скалярного объекта не представляет значение подтипа объекта (возможно, потому, что объект не был инициализирован), объект считается имеющим недопустимое представление. Вычисление значения такого объекта является ограниченной ошибкой. Если ошибка обнаружена, происходит поднятие исключения Constraint_Error или Program_Error. В противном случае выполнение продолжается с использованием недопустимого представления. Правила языка за пределами этого подраздела предполагают, что все объекты имеют допустимые представления. Семантика операций с недопустимыми представлениями следующая:
- Если представление объекта представляет значение типа объекта, используется значение типа.
- Если представление объекта не представляет значение типа объекта, семантика операций с такими представлениями определяется реализацией, но сама по себе не приводит к ошибочному или непредсказуемому выполнению или к тому, что другие объекты становятся ненормальными.
Ошибочное выполнение
Вызов импортированной функции или экземпляра Unchecked_Conversion является ошибочным, если результат является скалярным, объект результата имеет недопустимое представление и результат используется не как выражение оператора присваивания или объявления объекта, как имя объекта объявления переименования объекта, или как префикс атрибута Valid. Если такой объект результата используется в качестве источника присваивания, и присвоенное значение является недопустимым представлением для целевого объекта присваивания, то любое использование целевого объекта до дальнейшего присваивания целевому объекту, кроме как в качестве префикса ссылки на атрибут Valid, является ошибочным.
Обращение к значению доступа является ошибочным, если оно не обозначает объект соответствующего типа или подпрограмму с соответствующим профилем, если оно обозначает несуществующий объект или если это значение доступа к переменной, обозначающее постоянный объект, и оно не исходило от атрибута_ссылки, примененного к представлению ссылочной переменной контролируемого или неизменяемо ограниченного объекта. Значение доступа, обращение к которому ошибочно, может существовать, например, из-за Unchecked_Deallocation, Unchecked_Access или Unchecked_Conversion.
ПРИМЕЧАНИЯ
21 Объекты могут стать ненормальными из-за других видов действий, которые непосредственно обновляют представление объекта; однако такие действия обычно считаются непосредственно ошибочными.