comp.lang.ada
 help / color / mirror / Atom feed
From: Niklas Holsti <niklas.holsti@tidorum.invalid>
Subject: Re: Possible compiler bug with this simple program
Date: Thu, 28 Aug 2008 11:03:43 +0300
Date: 2008-08-28T11:03:43+03:00	[thread overview]
Message-ID: <48b65b3b$0$25384$4f793bc4@news.tdc.fi> (raw)
In-Reply-To: <1edc3682-855f-405b-8348-72b423377b1a@i20g2000prf.googlegroups.com>

Jerry wrote:
> The following is a program which emulates the structure of a binding
> to a bunch of C code (but there is no C code included here--it is all
> Ada). This structure exhibits a behavior which I think might be a
> compiler error but could be the result of incorrect declarations when
> running on certain machines.

I suspect that one problem is using the C convention to pass a 
parameter that is of an unconstrained array type, see below.

> Specifically, the program compiles (with two warnings which are
> expected and OK) and runs correctly on my machine, OS X 10.4.11
> running GNAT 4.3.0 (32-bit PowerPC G4). However, on someone else's
> box, a 64-bit Intel Duo running Debian lenny and GNAT 4.3.1-2, the
> program compiles but bombs at runtime with
> 
> raised STORAGE_ERROR : stack overflow (or erroneous memory access)
> 
> reported.
> 
> However, on the Debian lenny machine, if the three lines with
> 
>    --***
> 
> at the end of them are commented out (they relate to Pragma-C
> conventions), the program compiles and runs correctly, printing out 10
> lines of floats. (It also runs correctly on the OS X machine.)
> 
> Here is the program, stored in two files (damn the line wraps):
> 
...
> 
> procedure x19a_temp is
> 
>     procedure mapform19(n : Integer; x : in out Real_Vector); --***
>     pragma Convention(C, mapform19); --***

>     procedure mapform19(n : Integer; x : in out Real_Vector) is
...
> 
> 
> package type_declaration is
> 
>     type Real_Vector is array (Integer range <>) of Long_Float;

So Real_Vector is an unconstrained array type. According to RM 
B.3(70), the C convention passes only a single pointer to the first 
element of the array, so the 'Range attribute will not be available 
to the subprogram.

> As a second problem, in the program above there is a loop line that
> looks like this:
> 
>         for i in 0 .. n - 1 loop
> 
> One would normally write this as
> 
>         for i in x'range loop
> 
> but when this runs on the OS X box, it segfaults after printing about
> 187 lines of bogus floats. I don't know what happens on the Debian
> box. However, if the -- *** lines are commented out, it runs OK on OS
> X.
> 
> Comments?

My guess: the compiler implements convention C for the x parameter, 
which means x'range is not available, but the code for the second 
quoted for-loop tries to access x'range anyway -- boom! The 
compiler should IMHO have rejected the use of x'range here, with an 
error message.

Using the first form of the quoted loop may trigger the same 
problem in the code that checks that x(i) has a valid index, i.

In fact, when an Ada subprogram has an unconstrained array 
parameter with Convention C, it seems to me that the subprogram's 
body cannot make any use of individual elements of the array, 
because it doesn't know the index range, so the compiler should 
reject any indexing of such an array parameter, as well as any 
attempt to pass it on as a Convention Ada parameter.

Conclusion: Your program tries to do something that cannot possibly 
work, but the compiler should have told you so.

-- 
Niklas Holsti
Tidorum Ltd
niklas holsti tidorum fi
       .      @       .



  parent reply	other threads:[~2008-08-28  8:03 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-28  7:28 Possible compiler bug with this simple program Jerry
2008-08-28  7:56 ` Ludovic Brenta
2008-08-28 21:08   ` Jerry
2008-08-29 20:39     ` Ludovic Brenta
2008-08-29 21:20       ` Jerry
2008-08-29 21:31         ` Jerry
2008-09-02 22:10     ` Santiago Urueña
2008-08-28  8:03 ` Niklas Holsti [this message]
2008-08-28 15:54   ` Adam Beneschan
2008-08-28 15:56     ` Adam Beneschan
2008-08-28 21:01   ` Randy Brukardt
2008-08-28 21:29     ` Jerry
2008-08-30  1:00       ` Randy Brukardt
2008-08-30  4:47         ` Jerry
2008-09-01 11:19           ` Jerry
2008-09-03  4:22             ` Jerry
2008-09-03 14:20               ` Adam Beneschan
2008-09-04  0:22                 ` Jerry
2008-09-04  1:18                   ` Adam Beneschan
2008-09-04  3:53                     ` Randy Brukardt
2008-09-04  1:31                   ` Jeffrey R. Carter
2008-09-04 14:35                     ` Adam Beneschan
2008-09-04 14:42                       ` Jacob Sparre Andersen
2008-09-06  3:03                       ` Jerry
2008-09-05  8:17                     ` Ludovic Brenta
2008-09-05 15:56                       ` Adam Beneschan
2008-09-05 17:09                       ` Jeffrey R. Carter
2008-09-04 20:49                   ` Simon Wright
2008-08-28 21:16 ` Jerry
2008-08-29  7:41   ` Niklas Holsti
2008-08-30  0:50     ` Randy Brukardt
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox