GCC更新后出现意外的约束\u错误

GCC更新后出现意外的约束\u错误,gcc,ada,gnat,Gcc,Ada,Gnat,我们最近更新了GCC版本(4.8.2到5.3.0),并开始在一些Ada应用程序中收到意外的约束错误。我将其简化为以下内容: -- 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 =&

我们最近更新了GCC版本(4.8.2到5.3.0),并开始在一些Ada应用程序中收到意外的约束错误。我将其简化为以下内容:

-- 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版本上都可以正常编译(仅使用“gnatmake moo.adb”编译)。当使用4.8.2构建时,输出如预期:

item 0 = SOMETHING1
当使用5.0.3构建时,我们会收到

raised CONSTRAINT_ERROR : moo.adb:13 invalid data

有趣的是,当编译为32位和64位时,结果完全相同。为了使程序能够在5.3.0中正常运行,可以对许多内容进行更改:删除thing_type'size子句、向枚举数添加或删除值、更改数组中的项数、使用不同的值初始化数组等等。此代码是否存在任何明显的问题,可以解释此行为

它看起来像GCC/GNAT中的一个bug。 我可以在标准兼容模式下复制GNAT-GPL-2016的错误行为(
-gnato-fstack check-gnat12
)。关键部分似乎是
Something1
表示为
1
,而不是更典型的
0

我建议您向GCC开发人员报告此错误。

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

(gdb)捕获异常
要点2:所有Ada例外
(gdb)运行
启动程序:/Users/simon/tmp/so/moo
[进程75511的新线程0x1703]
捕捉点2,moo.adb:10处的_ada_moo()中0x0000000100001abe处的约束错误(moo.adb:10无效数据)
10文本io.put_行(“项目0=“&thing_type”图像(thing_数组(0));
(gdb)p thing_数组
$5 = (0 => 16843009, 16843009, 16843009, 16843009, 16843009, 16843009)
(gdb)p/x东西_阵列
$6=(0=>0x1010101、0x1010101、0x1010101、0x1010101、0x1010101、0x1010101、0x1010101)
因此GNAT错误地将
thing_数组
元素的每个字节设置为
16#01#
,而不是整个元素

如果将
something1
设置为2(随后的值也会增加),也会发生同样的情况

我能找到的唯一有用的东西就是声明,例如,

type base\u thing\u type是(无效,something 1,something 2,something 3,something 4,something 5,something 6);
对于基本类型使用(无效=>0,something1=>1,something2=>2,something3=>
3,something4=>4,something5=>5,something6=>6);
对于基本类型的尺寸,使用32;
类型thing\u type是新的基本类型范围something1。。一些事情6;

第13行有什么内容?(您的列表只有12行。)对不起,我粘贴时删除了原始列表中的一些空行。第13行是文本行。谢谢Simon,我将向GCC提交一份错误报告。Kevin,你曾经报告过这个错误吗?它仍然存在于GCC 8.0.0 20171216中。这个错误也存在于GNAT 8.3(来自Debian buster的版本)中,但不存在于GNAT 9.3(来自Ubuntu 20.04的版本)。在这个特定的示例中,它已被修复,但在我的一些应用程序中,9.3(或CE 2020)会引发其他无意义的“无效数据”(在8.3中没有引发!)。谢谢,错误报告是:(