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