我有以下程序:
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)