- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们最近更新了 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 的大小子句、向枚举器添加或删除值、更改数组中的项目数、使用不同的值来初始化数组等. 这段代码是否有任何明显的问题可以解释这种行为?
最佳答案
这个错误在 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;
关于gcc - GCC 更新后出现意外的 CONSTRAINT_ERROR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42818838/
我有一个数组,最多包含 20 个字符的字符串: subtype c_string is string(1..20); type string_array is array (natural range
我们最近更新了 GCC 版本(4.8.2 到 5.3.0)并开始在一些 Ada 应用程序中收到意外的约束错误。我已将其简化为以下内容: -- moo.adb with text_io; procedu
我一直在看这个Ada 95 tutorial .我读到可以定义一个范围不同于标准范围的类型,如果程序试图超出这个范围,它会抛出一个错误。在我自己的程序中工作时,我注意到如果定义中的范围的末尾落在其基础
我遇到了一个问题,即在 Ada 中使用不能被系统的 Storage_Unit 整除的模块化类型。 (在运行时的 system.ads 中定义)将引发 Constraint_Error在运行时访问时。我
我是一名优秀的程序员,十分优秀!