我有以下程序:
procedure Main with SPARK_Mode is
F : array (0 .. 10) of Integer := (0, 1, others => 0);
begin
for I in 2 .. F'Last loop
F (I) := F (I - 1) + F (I - 2);
end loop;
end Main;
如果我运行gnatprove
,我会得到以下结果,指向+
标志:
中:溢出检查可能会失败
这是否意味着F (I - 1)
可能等于Integer'Last
,并且添加任何内容都会溢出?如果是这样,那么从程序的流程中是否不清楚这是不可能的?还是我需要在合同中指定这一点?如果不是,那是什么意思?
一个反例表明,gnatprove
在这种情况下,确实担心 的边缘Integer
:
medium:溢出检查可能会失败(例如 when
F = (1 => -1, others => -2147483648)
和I = 2
)