2017-03-15 7 views
2

GCCバージョン(4.8.2から5.3.0)を最近更新し、一部のAdaアプリケーションで予期しない制約エラーが発生しました。 I以下に減少しました: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」を使用してコンパイル。) :5.0.3で構築された場合

item 0 = SOMETHING1 

、我々は代わりに32ビットおよび64ビットとしてコンパイルするとき

raised CONSTRAINT_ERROR : moo.adb:13 invalid data 

が興味深いことに、結果は全く同じである受け取ります。 thing_typeのsize句の削除、列挙子への値の追加または削除、配列内の項目数の変更、配列の初期化に異なる値の使用など、多くのことを5.3.0でうまく動作させるように変更できます。このコードでこの動作を説明できる明らかな問題はありますか?

+0

のですか? (あなたのリスティングには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が誤っなく素子全体よりも、16#01#thing_array要素の各バイトを設定しています。

something1が2に設定されている場合(同じように後で値が増えた場合)も同じことが起こります。私はそれができます見つけることができます

唯一のことは、ライン13上で何が、例えば、宣言する

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の不正な動作を複製できます。重要な部分は、より典型的な0の代わりにがとして表されているようです。 GCC開発者にバグを報告することをお勧めします。

+0

ありがとう、バグ報告それは: – Kevin

関連する問題