13.9.2 The Valid Attribute
1
The Valid attribute can be used to check the validity
of data produced by unchecked conversion, input, interface to foreign
languages, and the like.
Static Semantics
2
For a
prefix
X that denotes a scalar object [(after any implicit dereference)], the
following attribute is defined:
3/3
X'Valid
{
AI05-0153-3}
Yields True if and only if the object denoted by X is normal
, and has a valid representation
, and the
predicate of the nominal subtype of X evaluates to
True. The value of this attribute is of the predefined type Boolean.
3.a
Ramification: Having checked that X'Valid
is True, it is safe to read the value of X without fear of erroneous
execution caused by abnormality, or a bounded error caused by an invalid
representation. Such a read will produce a value in the subtype of X.
4
23 Invalid
data can be created in the following cases (not counting erroneous or
unpredictable execution):
5
an uninitialized scalar object,
6
the result of an unchecked conversion,
7
input,
8
interface to another language (including
machine code),
9
aborting an assignment,
10
disrupting an assignment due to the
failure of a language-defined check (see
11.6),
and
11
use of an object whose Address has
been specified.
12
24 X'Valid is not considered to be a read
of X; hence, it is not an error to check the validity of invalid data.
13/2
25 {
AI95-00426-01}
The Valid attribute may be used to check the result
of calling an instance of Unchecked_Conversion (or any other operation
that can return invalid values). However, an exception handler should
also be provided because implementations are permitted to raise Constraint_Error
or Program_Error if they detect the use of an invalid representation
(see 13.9.1).
13.a
Ramification: If X is of an enumeration
type with a representation clause, then X'Valid checks that the value
of X when viewed as an integer is one of the specified internal codes.
13.b
Reason: Valid is defined only for scalar
objects because the implementation and description burden would be too
high for other types. For example, given a typical run-time model, it
is impossible to check the validity of an access value. The same applies
to composite types implemented with internal pointers. One can check
the validity of a composite object by checking the validity of each of
its scalar subcomponents. The user should ensure that any composite types
that need to be checked for validity are represented in a way that does
not involve implementation-defined components, or gaps between components.
Furthermore, such types should not contain access subcomponents.
13.c/2
This paragraph
was deleted.{
AI95-00114-01}
Note that one can safely check the validity of
a composite object with an abnormal value only if the constraints on
the object and all of its subcomponents are static. Otherwise, evaluation
of the prefix
of the attribute_reference
causes erroneous execution (see 4.1).
Extensions to Ada 83
13.d
X'Valid is new in Ada 95.
Wording Changes from Ada 95
13.e/2
{
AI95-00426-01}
Added a note explaining that handlers for Constraint_Error
and Program_Error are needed in the general case of testing for validity.
(An implementation could document cases where these are not necessary,
but there is no language requirement.)
Wording Changes from Ada 2005
13.f/3
{
AI05-0153-3}
The validity check now also includes a check of
the predicate aspects (see 3.2.4), if any,
of the subtype of the object.
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe