Справочник по Ada 2005
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.
ПРИМЕЧАНИЯ
18 Объекты могут стать ненормальными из-за других видов действий, которые напрямую обновляют представление объекта; однако такие действия обычно считаются непосредственно ошибочными.