An unchecked conversion is a bit-for-bit copy without regard to
the meanings attached to those bits and bit positions by either
the source or the destination type. The source bit pattern can
easily be meaningless in the context of the destination type.
Unchecked conversions can create values that violate type constraints
on subsequent operations. Unchecked conversion of objects mismatched
in size has implementation-dependent
results.

Using the 'Valid attribute on scalar data allows you
to check whether it is in range without raising an exception if
it is out of range. There are several cases where such a validity
check enhances the readability and maintainability of the code:

- Data produced through an unchecked conversion

- Input data

- Parameter values returned from a foreign language interface

- Aborted assignment (during asynchronous transfer of control
or execution of an abort statement)

- Disrupted assignment from failure of a language-defined check

- Data whose address has been specified with the 'Address
attribute

An access value should not be assumed to be correct when obtained
without compiler or run-time checks. When dealing with access
values, use of the 'Valid attribute helps prevent the
erroneous dereferencing that might occur after using Ada.Unchecked_Deallocation,
Unchecked_Access, or Ada.Unchecked_Conversion.

In the case of a nonscalar object used as an actual parameter
in an unchecked conversion, you should ensure that its value on
return from the procedure properly represents a value in the subtype.
This case occurs when the parameter is of mode out or
in out. It is important to check the value when interfacing
to foreign languages or using a language-defined input procedure.
The Ada Reference
Manual (1995, §13.9.1) lists the full rules
concerning data validity.