在ada中查找子流类型

时间:2017-09-19 11:51:43

标签: overflow numeric ada subtype

我正试图找到自动识别Ada语言中子类型溢出错误的方法。

下面是Ada语言语法。

C :=  A + B;

-- A is sub type of [-3  3]
-- B is sub type of [-2 2]
-- C is sub type of [-3  3]

我想要的是,工具应该使用输入参数的最小值,最大值,中值,并记录目标参数中是否有任何溢出流。

例如最大值A的值为3和最大值B(2)的值,C变量中会有过流。

我有5000个文件,我需要确保不存在上述类型的错误。我正在寻找自动完成的方法。

1 个答案:

答案 0 :(得分:0)

如果你在编译时知道所有的值,那就很容易了。否则它会有点复杂。但是如果你违反任何约束,你将总是在运行时获得Constraint_Error。

with Ada.Integer_Text_IO;

procedure Main is 
   subtype A_T is Integer range -3..3;
   subtype B_T is Integer range -2..2;
   subtype C_T is Integer range -3..3;

   A : A_T := 3;
   B : B_T := 2;
   C : C_T;

   AA : A_T := 1;
   BB : B_T := 1;
   CC : C_T;

   AAA : A_T;
   BBB : B_T;
   CCC : C_T;
begin

   C := A + B; -- Not ok warning: value not in range of type C_T,
   -- Constraint_Error will be riased at run time

   CC := AA + BB; -- OK, no overflow detected at compile time

   Ada.Integer_Text_IO.Get(AAA); -- impossible to check at compile time, 
   Ada.Integer_Text_IO.Get(BBB); -- Constraint_Error will be raised at runtime if constraint violated
   CCC := AAA + BBB;
end Main;