2017-03-15 28 views
2

我们最近更新了GCC版本(4.8.2至5.3.0),并在某些Ada应用程序中开始接收意外的约束错误。我已经将它归纳为以下:GCC更新后出现意外的CONSTRAINT_ERROR

-- moo.adb 
with text_io; 
procedure moo is 
    type thing_type is (something1,something2,something3,something4,something5,something6); 
    for thing_type use (something1 => 1,something2 => 2,something3 => 
     3,something4 => 4,something5 => 5,something6 => 6); 
    for thing_type'size use 32; 
    type thing_array_t is array (0 .. 5) of thing_type; 
    thing_array : thing_array_t := (others => something1); 
begin 
    text_io.put_line("item 0 = " & thing_type'image(thing_array(0))); 
end moo; 

该程序将汇编要么版本的GCC当与4.8.2兴建,预期输出(简单地加上“gnatmake moo.adb”编译。)就好了:

item 0 = SOMETHING1 

当与5.0.3建成,我们代替接收

raised CONSTRAINT_ERROR : moo.adb:13 invalid data 

有趣的是,当如32和64位汇编的结果是完全一样的。为了使程序在5.3.0下正常工作,可以改变许多东西:删除thing_type'size子句,向枚举器添加或删除值,更改数组中项目的数量,使用不同的值来初始化数组等等。这个代码有什么明显的问题可以解释这种行为吗?

+0

什么是第13行? (您的列表只有12行) –

+0

对不起,我在粘贴时删除了原来的一些空白行。第13行是text_io行。 – Kevin

回答

6

这个错误在GCC 7.0.1中仍然存在。调试器下运行,输出稍编辑,

(gdb) catch exception 
Catchpoint 2: all Ada exceptions 
(gdb) run 
Starting program: /Users/simon/tmp/so/moo 
[New Thread 0x1703 of process 75511] 

Catchpoint 2, CONSTRAINT_ERROR (moo.adb:10 invalid data) at 0x0000000100001abe in _ada_moo() at moo.adb:10 
10  text_io.put_line("item 0 = " & thing_type'image(thing_array(0))); 
(gdb) p thing_array 
$5 = (0 => 16843009, 16843009, 16843009, 16843009, 16843009, 16843009) 
(gdb) p/x thing_array 
$6 = (0 => 0x1010101, 0x1010101, 0x1010101, 0x1010101, 0x1010101, 0x1010101) 

所以GNAT thing_array元件中的每一个字节错误地设置为16#01#,而不是整个元件。

如果something1设置为2(并且后面的值同样增加),则会发生同样的情况。

我能找到帮助的唯一的事情是声明,例如,

type base_thing_type is (invalid, something1,something2,something3,something4,something5,something6); 
for base_thing_type use (invalid => 0, something1 => 1,something2 => 2,something3 => 
         3,something4 => 4,something5 => 5,something6 => 6); 
for base_thing_type'size use 32; 
type thing_type is new base_thing_type range something1 .. something6; 
+0

谢谢西蒙,我会向GCC提交一个错误报告。 – Kevin

+0

凯文,你曾经报告过这个错误吗?它仍然存在于GCC 8.0.0 20171216 –

4

它看起来像GCC/GNAT中的错误。 我可以在标准兼容模式(-gnato -fstack-check -gnat12)下使用GNAT-GPL-2016复制不正确的行为。关键部分似乎是Something1表示为1而不是更典型的0。 我建议你向GCC开发者报告错误。

+0

谢谢,错误报告是:( – Kevin