comp.lang.ada
 help / color / mirror / Atom feed
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.


  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