From: Georg Bauhaus <bauhaus@futureapps.invalid>
Subject: Re: SPARK - strange range check with array assignment
Date: Wed, 19 Aug 2015 00:07:18 +0200
Date: 2015-08-19T00:07:18+02:00 [thread overview]
Message-ID: <mr0a7f$ba1$1@dont-email.me> (raw)
In-Reply-To: <6cd2abfc-63e4-4821-b8d3-143ec25f4619@googlegroups.com>
On 18.08.15 22:06, Maciej Sobczak wrote:
> Consider (extracted from a bigger problem):
>
> -- p.ads:
> pragma SPARK_Mode;
>
> package P is
>
> procedure Foo (S : in out String)
> with Pre => S'Length > 3;
>
> end P;
>
> -- p.adb:
> pragma SPARK_Mode;
>
> package body P is
>
> procedure Foo (S : in out String)
> is
> begin
> S (S'First .. S'First + 2) := "abc"; -- HERE
> end Foo;
>
> end P;
>
>
> Foo is intended to overwrite the beginning of the given string.
> GNATProve (2014) says:
>
> p.adb:8:37: warning: range check might fail
>
> Curiously, the assertion added just before the failing line:
>
> pragma Assert (S'First + 2 in S'Range);
>
> passes without any warning.
>
> What value or expression above is subject to a range check that might fail?
Maybe there are hints at some historic reasons in two quotes from [1] about
the original SPARK:
"SPARK does not have array slices". (p.103)
"It is important to realize that since all constraints have to be static
it follows that all arrays have static bounds. Thus we cannot declare
an array in SPARK whose bounds are not known until the program executes.
This may be felt rather irksome but is necessary if the space occupied
by the program is to be predictably bounded." (p.96)
[1] Barnes, John (1997). High Integrity Ada. The SPARK Approach.
next prev parent reply other threads:[~2015-08-18 22:07 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-18 20:06 SPARK - strange range check with array assignment Maciej Sobczak
2015-08-18 22:07 ` Georg Bauhaus [this message]
2015-08-19 0:11 ` Anh Vo
2015-08-19 10:09 ` Maciej Sobczak
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox