Unchecked type conversions can be achieved in any language that permits code insertions or address clauses. Such conversions may, for example, be needed if a user wants to define his own allocation strategy for access types. In this case, conversions from integer to access values are necessary to define an ALLOCATE procedure and a converse FREE procedure.
From the point of view of programming management (and also of maintainability) it is desirable to provide a standard way to achieve such unchecked conversions. In this way the parts of a program that use such dangerous features are made easier to identify. The following generic library function is predefined to that effect.
generic type SOURCE is limited private; type TARGET is limited private; function UNCHECKED_CONVERSION(S : SOURCE) return TARGET; |
A program unit that uses unchecked type conversions must mention this generic function in its with clauses. A possible scenario is indicated with the package LIST_HANDLING given below:
package LIST_HANDLING is
type PLACE;
type LIST is access PLACE;
type PLACE is
record
SUCC, PRED : LIST;
VALUE : INTEGER;
end record;
...
procedure ALLOCATE (X : out LIST);
procedure FREE (X : in out LIST);
...
pragma CONTROLLED(LIST); -- no garbage collection
for LIST'STORAGE_SIZE use 0; -- new will not be usable
end;
with UNCHECKED_CONVERSION;
package body LIST_HANDLING is
function INT_TO_LIST is
new UNCHECKED_CONVERSION(SOURCE => INTEGER,
TARGET => LIST);
...
procedure ALLOCATE(X : out LIST) is
ADDRESS : INTEGER;
begin
...
-- Compute address, Then:
X := INT_TO_LIST(ADDRESS);
end;
...
end LIST_HANDLING;
|
The function INT_TO_LIST is obtained within the body of LIST_HANDLING by instantiation of UNCHECKED_CONVERSION, and is used to convert an integer address into a LIST.
The programming environment may be able to control and restrict the programs that are allowed to get access to the function UNCHECKED_CONVERSION.