我是for ***'Address use ***
的新用法。我想知道這種用法有什麼限制。所以,我創建了以下程序:EXCEPTION_ACCESS_VIOLATION靜態聲明
procedure letshack (A : System.Address) is
My_String : String(1..100000);
for My_String'Address use A;
begin
Put(My_String);
end;
這提出一個EXCEPTION_ACCESS_VIOLATION
同時用字符串是100長度相同的代碼不養它。如果我不使用整數地址,則此代碼可以正常工作。
那麼for ***'Address use ***
的用法有什麼限制。 Ps:我正在使用Ada 95,但歡迎任何信息。
編輯: 我瞭解一部分行爲。這就是我想的。 當你開始你的程序時,一個堆棧被分配,你可以寫入和讀入。事實上,我有一個整數地址
Real Addresses |----------------------------| Virtual Addresses
0x48000|Stack Origine |0x00
| |
| |
| |
| |
|End of Stack |
0x48000+range|----------------------------|0x00+range
寫了5個字節,你會得到EXCEPTION_ACCESS_VIOLATION如果你是出棧。如果它是正確的話,那麼「強」語言似乎很奇怪。因爲這意味着你可以重寫自己的堆棧並使其行爲不當。
這可能取決於呼叫 - 特別是A的實際 - 而不是程序本身。製作一個演示的[MCVE]。顯然,如果整個字符串不屬於你的過程,會發生不好的事情。如果你正在嘗試編寫病毒,那麼它的語言要比Ada更好:-) –
每當你做一個Address overlay時,你也應該做一個'pragma Import(Ada,My_String);'(或等價的方面),爲了防止重疊對象的默認初始化(本例中爲My_String) – egilhh
@BrianDrummond彙編語言,因爲地址計算,位大小問題,抑制檢查等的可能性在標準Ada中都是可用的和明確的,病毒可以使Ada的功能獲利。使用SPARKAda,病毒的算法甚至可能被驗證並可能被驗證。如果真的想在專業環境中編寫病毒,看起來並不那麼糟糕。 – B98