blob: 12379a1a551e8bbad8fcd140f1d04182877efa87 [file] [log] [blame]
-- CXH1001.A
--
-- Grant of Unlimited Rights
--
-- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
-- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
-- unlimited rights in the software and documentation contained herein.
-- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
-- this public release, the Government intends to confer upon all
-- recipients unlimited rights equal to those held by the Government.
-- These rights include rights to use, duplicate, release or disclose the
-- released technical data and computer software in whole or in part, in
-- any manner and for any purpose whatsoever, and to have or permit others
-- to do so.
--
-- DISCLAIMER
--
-- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
-- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
-- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
-- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
-- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
-- PARTICULAR PURPOSE OF SAID MATERIAL.
--*
--
-- OBJECTIVE
-- Check pragma Normalize_Scalars.
-- Check that this configuration pragma causes uninitialized scalar
-- objects to be set to a predictable value. Check that multiple
-- compilation units are affected. Check for uninitialized scalar
-- objects that are subcomponents of composite objects, unassigned
-- out parameters, objects that have been allocated without an initial
-- value, and objects that are stand alone.
--
-- TEST DESCRIPTION
-- The test requires that the configuration pragma Normalize_Scalars
-- be processed. It then defines a few scalar types (some enumeration,
-- some integer) in a few packages. The scalar types are designed such
-- that the representation will easily allow for an out of range value.
-- Unchecked_Conversion and the 'Valid attribute are both used to verify
-- that the default values of the various kinds of objects are indeed
-- invalid for the type.
--
-- Note that this test relies on having uninitialized objects, compilers
-- may generate several warnings to this effect.
--
-- SPECIAL REQUIREMENTS
-- The implementation must process configuration pragmas which
-- are not part of any Compilation Unit; the method employed
-- is implementation defined.
--
-- APPLICABILITY CRITERIA:
-- This test is only applicable for a compiler attempting validation
-- for the Safety and Security Annex.
--
--
-- CHANGE HISTORY:
-- 26 OCT 95 SAIC Initial version
-- 04 NOV 96 SAIC Added cases, upgraded commentary
--
--!
---------------------------- CONFIGURATION PRAGMAS -----------------------
pragma Normalize_Scalars; -- OK
-- configuration pragma
------------------------ END OF CONFIGURATION PRAGMAS --------------------
----------------------------------------------------------------- CXH1001_0
with Impdef.Annex_H;
with Unchecked_Conversion;
package CXH1001_0 is
package Imp_H renames Impdef.Annex_H;
use type Imp_H.Small_Number;
use type Imp_H.Scalar_To_Normalize;
Global_Object : Imp_H.Scalar_To_Normalize;
-- if the pragma is in effect, this should come up with the predictable
-- value
Global_Number : Imp_H.Small_Number;
-- if the pragma is in effect, this should come up with the predictable
-- value
procedure Package_Check;
type Num is range 0..2**Imp_H.Scalar_To_Normalize'Size-1;
for Num'Size use Imp_H.Scalar_To_Normalize'Size;
function STN_2_Num is
new Unchecked_Conversion( Imp_H.Scalar_To_Normalize, Num );
Small_Last : constant Integer := Integer(Imp_H.Small_Number'Last);
end CXH1001_0;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
with Report;
package body CXH1001_0 is
procedure Heap_Check( A_Value : access Imp_H.Scalar_To_Normalize;
A_Number : access Imp_H.Small_Number ) is
Value : Num;
Number : Integer;
begin
if A_Value.all'Valid then
Value := STN_2_Num ( A_Value.all );
if Imp_H.Default_For_Scalar_To_Normalize_Is_In_Range then
if Imp_H.Scalar_To_Normalize'Val(Value)
/= Imp_H.Default_For_Scalar_To_Normalize then
Report.Failed("Implicit initial value for local variable is not "
& "the predicted value");
end if;
else
if Value in 0 ..
Imp_H.Scalar_To_Normalize'Pos(Imp_H.Scalar_To_Normalize'Last) then
Report.Failed("Implicit initial value for local variable is a "
& "value of the type");
end if;
end if;
end if;
if A_Number.all'Valid then
Number := Integer( A_Number.all );
if Imp_H.Default_For_Small_Number_Is_In_Range then
if Global_Number /= Imp_H.Default_For_Small_Number then
Report.Failed("Implicit initial value for number is not "
& "the predicted value");
end if;
else
if Integer( Global_Number ) in 0 .. Report.Ident_Int(Small_Last) then
Report.Failed("Implicit initial value for number is a "
& "value of the type");
end if;
end if;
end if;
end Heap_Check;
procedure Package_Check is
Value : Num;
Number : Integer;
begin
if Global_Object'Valid then
Value := STN_2_Num ( Global_Object );
if Imp_H.Default_For_Scalar_To_Normalize_Is_In_Range then
if Imp_H.Scalar_To_Normalize'Val(Value)
/= Imp_H.Default_For_Scalar_To_Normalize then
Report.Failed("Implicit initial value for local variable is not "
& "the predicted value");
end if;
else
if Value in 0 ..
Imp_H.Scalar_To_Normalize'Pos(Imp_H.Scalar_To_Normalize'Last) then
Report.Failed("Implicit initial value for local variable is a "
& "value of the type");
end if;
end if;
end if;
if Global_Number'Valid then
Number := Integer( Global_Number );
if Imp_H.Default_For_Small_Number_Is_In_Range then
if Global_Number /= Imp_H.Default_For_Small_Number then
Report.Failed("Implicit initial value for number is not "
& "the predicted value");
end if;
else
if Integer( Global_Number ) in 0 .. Report.Ident_Int(Small_Last) then
Report.Failed("Implicit initial value for number is a "
& "value of the type");
end if;
end if;
end if;
Heap_Check( new Imp_H.Scalar_To_Normalize, new Imp_H.Small_Number );
end Package_Check;
end CXH1001_0;
----------------------------------------------------------------- CXH1001_1
with Unchecked_Conversion;
package CXH1001_0.CXH1001_1 is
-- kill as many birds as possible with a single stone:
-- embed a protected object in the body of a child package,
-- checks the multiple compilation unit case,
-- and part of the subcomponent case.
protected Thingy is
procedure Check_Embedded_Values;
private
Hidden_Object : Imp_H.Scalar_To_Normalize; -- not initialized
Hidden_Number : Imp_H.Small_Number; -- not initialized
end Thingy;
end CXH1001_0.CXH1001_1;
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
with Report;
package body CXH1001_0.CXH1001_1 is
Childs_Object : Imp_H.Scalar_To_Normalize; -- not initialized
protected body Thingy is
procedure Check_Embedded_Values is
begin
if Imp_H.Default_For_Scalar_To_Normalize_Is_In_Range then
if Childs_Object /= Imp_H.Default_For_Scalar_To_Normalize then
Report.Failed("Implicit initial value for child object is not "
& "the predicted value");
end if;
elsif Childs_Object'Valid and then STN_2_Num( Childs_Object ) in 0 ..
Imp_H.Scalar_To_Normalize'Pos(Imp_H.Scalar_To_Normalize'Last) then
Report.Failed("Implicit initial value for child object is a "
& "value of the type");
end if;
if Imp_H.Default_For_Scalar_To_Normalize_Is_In_Range then
if Hidden_Object /= Imp_H.Default_For_Scalar_To_Normalize then
Report.Failed("Implicit initial value for protected package object "
& "is not the predicted value");
end if;
elsif Hidden_Object'Valid and then STN_2_Num( Hidden_Object ) in 0 ..
Imp_H.Scalar_To_Normalize'Pos(Imp_H.Scalar_To_Normalize'Last) then
Report.Failed("Implicit initial value for protected component "
& "is a value of the type");
end if;
if Imp_H.Default_For_Small_Number_Is_In_Range then
if Hidden_Number /= Imp_H.Default_For_Small_Number then
Report.Failed("Implicit initial value for protected number "
& "is not the predicted value");
end if;
elsif Hidden_Number'Valid and then Hidden_Number in
0 .. Imp_H.Small_Number(Report.Ident_Int(Small_Last)) then
Report.Failed("Implicit initial value for protected number "
& "is a value of the type");
end if;
end Check_Embedded_Values;
end Thingy;
end CXH1001_0.CXH1001_1;
------------------------------------------------------------------- CXH1001
with Impdef.Annex_H;
with Report;
with CXH1001_0.CXH1001_1;
procedure CXH1001 is
package Imp_H renames Impdef.Annex_H;
use type CXH1001_0.Num;
My_Object : Imp_H.Scalar_To_Normalize; -- not initialized
Value : CXH1001_0.Num := CXH1001_0.STN_2_Num ( My_Object );
-- My_Object is not initialized
Parameter_Value : Imp_H.Scalar_To_Normalize
:= Imp_H.Scalar_To_Normalize'Last;
type Structure is record -- not initialized
Std_Int : Integer;
Scalar : Imp_H.Scalar_To_Normalize;
Num : CXH1001_0.Num;
end record;
S : Structure; -- not initialized
procedure Bad_Code( Unassigned : out Imp_H.Scalar_To_Normalize ) is
-- returns uninitialized OUT parameter
begin
if Report.Ident_Int( 0 ) = 1 then
Report.Failed( "Nothing is something" );
Unassigned := Imp_H.Scalar_To_Normalize'First;
end if;
end Bad_Code;
procedure Check( V : CXH1001_0.Num; Message : String ) is
begin
if Imp_H.Default_For_Scalar_To_Normalize_Is_In_Range then
if V /= Imp_H.Scalar_To_Normalize'Pos(
Imp_H.Default_For_Scalar_To_Normalize) then
Report.Failed(Message & ": Implicit initial value for object "
& "is not the predicted value");
end if;
elsif V'Valid and then V in
0 .. Imp_H.Scalar_To_Normalize'Pos(Imp_H.Scalar_To_Normalize'Last) then
Report.Failed(Message & ": Implicit initial value for object "
& "is a value of the type");
end if;
end Check;
begin -- Main test procedure.
Report.Test ("CXH1001", "Check that the configuration pragma " &
"Normalize_Scalars causes uninitialized scalar " &
"objects to be set to a predictable value. " &
"Check that multiple compilation units are " &
"affected. Check for uninitialized scalar " &
"objects that are subcomponents of composite " &
"objects, unassigned out parameters, have been " &
"allocated without an initial value, and are " &
"stand alone." );
CXH1001_0.Package_Check;
if My_Object'Valid then
Value := CXH1001_0.STN_2_Num ( My_Object ); -- My_Object not initialized
end if;
-- otherwise, we just leave Value uninitialized
Check( Value, "main procedure variable" );
Bad_Code( Parameter_Value );
if Parameter_Value'Valid then
Check( CXH1001_0.STN_2_Num ( Parameter_Value ), "Out parameter return" );
end if;
if S.Scalar'Valid then
Check( CXH1001_0.STN_2_Num ( S.Scalar ), "Record component" );
end if;
CXH1001_0.CXH1001_1.Thingy.Check_Embedded_Values;
Report.Result;
end CXH1001;