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: