[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#643663: gnat: Illegal program not detected (record component with no supplied value) and invalid access to atomic variable



Package: gnat-4.6
Version: 4.6.1-5
Severity: normal
Tags: upstream
Forwarded: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50558

I reported this bug to the gcc bugzilla.

The following invalid program (component 'Reserved' does not have default
value) compiles with no error (gcc 4.6.1 and 4.7.0 (snapshot) on Debian):

package Pkg is
   type Byte is mod 2**8;
   type Reserved_24 is mod 2**24;

   type Data_Record is
      record
         Data : Byte;
         Reserved : Reserved_24;
      end record;

   for Data_Record use
      record
         Data at 0 range 0 .. 7;
         Reserved at 0 range 8 .. 31;
      end record;

   for Data_Record'Size use 32;
   for Data_Record'Alignment use 4;
end Pkg;

package Pkg.Reg is
   Data_Register : Data_Record;
   pragma Atomic (Data_Register);
end Pkg.Reg;

with Pkg.Reg;
procedure Test is
begin
   Pkg.Reg.Data_Register := (
      Data => 255,
      others => <> -- expected error: no value supplied for component
"Reserved"
   );
end Test;

gnat gives expected error message if definition of Data_Register moved to Pkg.
Representation clause for Data_Record and pragma Atomic is not required to
trigger this bug, but with them strange assembler code generated at leas on
x86_64 and cortex-m3:

_ada_test:
        movl    $0, pkg__reg__data_register(%rip)
        movb    $-1, pkg__reg__data_register(%rip)
        ret

_ada_test:
        ldr     r3, .L2
        movs    r2, #0
        str     r2, [r3, #0]
        movs    r2, #255
        strb    r2, [r3, #0]
        bx      lr

Note that atomic variable is accessed twice. I'm not yet sure if this bug can
be reproduced by a valid program.

-- System Information:
Debian Release: wheezy/sid
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)

Kernel: Linux 3.0.0-1-amd64 (SMP w/2 CPU cores)
Locale: LANG=uk_UA.UTF-8, LC_CTYPE=uk_UA.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages gnat-4.6 depends on:
ii  gcc-4.6            4.6.1-13        
ii  gnat-4.6-base      4.6.1-5         
ii  libc6              2.13-21         
ii  libc6-dev          2.13-21         
ii  libgcc1            1:4.6.1-13      
ii  libgmp10           2:5.0.2+dfsg-1  
ii  libgnat-4.6        4.6.1-5         
ii  libgnatprj4.6      4.6.1-5         
ii  libgnatvsn4.6      4.6.1-5         
ii  libmpc2            0.9-3           
ii  libmpfr4           3.0.1-6         
ii  multiarch-support  2.13-21         
ii  zlib1g             1:1.2.3.4.dfsg-3

gnat-4.6 recommends no packages.

Versions of packages gnat-4.6 suggests:
pn  ada-reference-manual  <none>
pn  gnat-4.6-doc          <none>
pn  gnat-4.6-sjlj         <none>

-- no debconf information
package Pkg is
   type Byte is mod 2**8;
   type Reserved_24 is mod 2**24;

   type Data_Record is
      record
         Data : Byte;
         Reserved : Reserved_24;
      end record;

   for Data_Record use
      record
         Data at 0 range 0 .. 7;
         Reserved at 0 range 8 .. 31;
      end record;

   for Data_Record'Size use 32;
   for Data_Record'Alignment use 4;
end Pkg;

package Pkg.Reg is
   Data_Register : Data_Record;
   pragma Atomic (Data_Register);
end Pkg.Reg;

with Pkg.Reg;
procedure Test is
begin
   Pkg.Reg.Data_Register := (
      Data => 255,
      others => <> -- expected error: no value supplied for component "Reserved"
   );
end Test;
package Pkg is
   type Byte is mod 2**8;
   type Reserved_24 is mod 2**24;

   type Data_Record is
      record
         Data : Byte;
         Reserved : Reserved_24;
      end record;

   for Data_Record use
      record
         Data at 0 range 0 .. 7;
         Reserved at 0 range 8 .. 31;
      end record;

   for Data_Record'Size use 32;
   for Data_Record'Alignment use 4;

   Data_Register : Data_Record;
   pragma Atomic (Data_Register);
end Pkg;

with Pkg;
procedure Test is
begin
   Pkg.Data_Register := (
      Data => 255,
      others => <> -- expected error: no value supplied for component "Reserved"
   );
end Test;

Reply to: