2014-09-29 59 views
0

我正在從另一家公司繼承的遺留Ada 95項目上工作。我最近將編譯器從Gnat 3.13a1升級到Gnat 4.7.4。該程序仍在編譯,但其中一個任務由於Constraint_Error而崩潰。Gnat編譯器升級導致出現與枚舉相關的Constraint_Error出現

Process_Ua(Buffer, Msg_Kind); 

Tr_Log5("MSG KIND IS: " & Message_Received_Type'Image(Msg_Kind)); 

Constraint_Error發生在上面的第二行,並帶有「無效數據」消息。 Msg_Kind的類型是Message_Received_Type(這是一個枚舉類型),並且在該子程序的開始處它被正確初始化,所以我無法理解如何將任何不是M​​essage_Received_Type的任何內容分配給Msg_Kind會導致發生Constraint_Error。

+0

嘗試在'Tr_Log5'調用之前檢查'MsgKind'或'Message_Received_Type'Pos(Msg_Kind)'的值。 – 2014-09-29 23:44:25

+0

不知道這是否是正確的方法,但我已經使用「Integer'Image(Message_Received_Type'Pos(Msg_Kind))」記錄了您所說的內容。它打印「32」,但Message_Received_Type只有6個可能的值。這怎麼會發生?這個模塊在過去的15年中一直沒有改變,只是在新的編譯器中出現了這個問題。 – Ogre 2014-09-30 00:05:36

+1

恩,你的程序中有一個錯誤?也許問題一直存在,並且問題隱藏了,因爲較舊的編譯器未能引發'Constraint_Error'。這只是我的猜測。你還能訪問舊的編譯器嗎? – 2014-09-30 00:09:59

回答

1

Invalid_Data始終是未初始化變量的標誌。

我相信你與-gnatVapragma Initialize_Scalars(你已經把一個gnat.adc文件或從項目的Builder'Global_Configuration_Pragmas屬性引用的文件)進行編譯。

在這種情況下,編譯器會嘗試使用無效值(有效範圍之外)初始化變量,並添加其他檢查。當檢查失敗時,他們會引起Invalid_Data異常。

也許舊的編譯器總是初始化一個out參數(但這會令人驚訝,它會如何選擇默認值)?

+0

「'Invalid_Data'始終是未初始化變量的標誌。」 - 總是?這可能是由於一個無效值的'Unchecked_Conversion'造成的,或者是由於抑制了檢查而做了一些不安全的事情。 – 2014-09-30 16:24:43

+0

是的,它也可能是您的代碼中定義的異常。根據我的經驗,當使用'-gnatVa'和'Initialize_Scalars'時,它是一個未初始化的變量。 – manuBriot 2014-09-30 16:44:13