comp.lang.ada
 help / color / mirror / Atom feed
From: Jerry <lanceboyle@qwest.net>
Subject: Re: Possible compiler bug with this simple program
Date: Thu, 28 Aug 2008 14:16:21 -0700 (PDT)
Date: 2008-08-28T14:16:21-07:00	[thread overview]
Message-ID: <d63f58f1-a332-4484-a5b2-fb8e15441410@v13g2000pro.googlegroups.com> (raw)
In-Reply-To: 1edc3682-855f-405b-8348-72b423377b1a@i20g2000prf.googlegroups.com

On Aug 28, 12:28 am, Jerry <lancebo...@qwest.net> 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.
>
> 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):
>
> ========== Begin program ==========
>
> with
>     type_declaration,
>     Ada.Text_IO;
> use
>     type_declaration,
>     Ada.Text_IO;
>
> 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
>     begin
>         for i in 0 .. n - 1 loop
>             x(i) := Long_Float(i);
>             Put_Line(Long_Float'image(x(i)));
>         end loop;
>     end mapform19;
>
> begin
>     plmap(mapform19'Unrestricted_Access);
> end x19a_temp;
>
> package type_declaration is
>
>     type Real_Vector is array (Integer range <>) of Long_Float;
>
>     type Map_Form_Function_Pointer_Type is access
>         procedure (Length_Of_x : Integer; x : in out Real_Vector);
>     pragma Convention(Convention => C,
>          Entity => Map_Form_Function_Pointer_Type); --***
>
>     procedure plmap(Map_Form_Function_Pointer :
> Map_Form_Function_Pointer_Type);
>
> end type_declaration;
>
> ========== End program ============
>
> Now: Here are some integer declaration sizes for the OS X 32-bit
> version and the Debian 64-bit version. I could provide more but these
> should be more than sufficient if there is in fact a problem in this
> area.
>
> ===== OS X 32-bit sizes =====
> Integer bits is  32
> Long_Integer bits is  32
> Long_Long_Integer bits is  64
> Long_Float bits is  64
> In Interfaces.C, int bits is 32
> In Interfaces.C, long bits is 32
> In Interfaces.C, C_float bits is 32
> In Interfaces.C, double bits is 64
>
> ===== Debian 64-bit sizes =====
> Integer bits is  32
> Long_Integer bits is  64
> Long_Long_Integer bits is  64
> Long_Float bits is  64
> In Interfaces.C, int bits is 32
> In Interfaces.C, long bits is 64
> In Interfaces.C, C_float bits is 32
> In Interfaces.C, double bits is 64
>
> I'm inclined to think that there is a compiler problem that makes the
> 64-bit Debian version crash but am wondering if there could be a
> problem with word lengths that causes the problem.
>
> 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?
>
> Jerry


Thanks, everybody, for the comments.

As for the second problem ( in 0 .. n - 1 loop versus for i in x'range
loop), my main concern (since I have a workaround--the first form) is
that the compiler allows the second form at all. It looks like a
situation where a simple syntactically correct program bombs.

Also, I should have mentioned that the two warnings that are emitted
at compile time as a result of passing the unconstrained array via C
conventions are this:

x19a_temp.adb:10:38: warning: type of argument "mapform19.x" is
unconstrained array
x19a_temp.adb:10:38: warning: foreign caller must pass bounds
explicitly

I get this pair of warnings in other places where I do some callbacks
to C so I expected to see it here, as well, and I'm fine with that.


Also, I apologize for not including the body part of type_declarations
which looks like this:

========== Begin body part ==========

package body type_declaration is

    procedure plmap(Map_Form_Function_Pointer :
Map_Form_Function_Pointer_Type) is
        xx : Real_Vector(0 .. 9);
    begin
        Map_Form_Function_Pointer(xx'length, xx);
    end plmap;

end type_declaration;

========== End body part ==========

Does the declaration of xx here as a constrained array change anyone's
comments about array boundaries not being known later?



  parent reply	other threads:[~2008-08-28 21:16 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
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 [this message]
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