2013-01-09 56 views
15

我正在調整一個大的Delphi代碼庫到64位。在很多情況下,有些情況下指針被強制轉換爲/從32位值,類似於此行:德爾福64位:發現不正確的演員?

var 
    p1,p2 : pointer; 
begin 
    inc(Integer(p1),10); 
    p2 := Pointer(Integer(p1) + 42); 

我在哪裏可以找到這些類型轉換我與他們取代NativeInt-蒙上而不是讓他們在64正確位模式。

但是我不確定我是否找到了他們。由於「整數」(如果指針值高於整數範圍,「64位轉換將失敗」),因爲只有文本搜索字符串「integer(」是不夠的

由於「類型我有一個想法:如果我可以強制內存管理器分配高於4GB的內存(所以指針值使用多於32位),那我會得到運行時錯誤,並且可以更容易地找到錯誤的類型。這是可能的嗎?或者任何人都可以推薦一些其他的技術嗎?

回答

21

除了您正在使用的文本搜索之外,找到這些轉換並沒有什麼魔術技巧,如果編譯器警告這樣的轉換,那將非常好。非常令人失望的是它沒有。

當您發現此類問題時,請勿更改爲NativeInt。將指針更改爲鍵入的指針,並使用指針算術。

var 
    p1, p2: PByte; 
.... 
inc(p1, 10); 
p2 := p2; 
inc(p2, 42); 

然後你的代碼將永遠安全。

仍然有些情況下需要轉換爲整數。例如,將地址傳遞給SendMessage時。但適當時將這些投射到WPARAMLPARAM

您強制運行時錯誤的想法是合理的,謝天謝地,您不是原創的!您應該使用完整版FastMM並定義AlwaysAllocateTopDown。這會強制FastMM對VirtualAlloc的呼叫通過MEM_TOP_DOWN標誌。這將清除大部分錯誤的強制轉換爲運行時指針截斷錯誤。

但是,這隻會強制由內存管理器分配內存的自上而下分配。您的流程中的其他模塊將使用自下而上的默認策略。您可以設置機器範圍設置來更改該默認策略。將HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management\AllocationPreference設置爲REG_DWORD,值爲0x100000並重新啓動。

請注意,這可能會導致您的機器出現穩定性問題。許多應用程序無法應對此。特別是有很少的防病毒產品可以應付這種設置。 MSE是我發現的機器範圍內自頂向下分配的工作。更重要的是,64位調試器不能在自頂向下分配下運行!所以你必須在沒有調試器的情況下進行這種測試。我的QC report仍然是開放的,即使在XE3中也沒有解決這個問題。

+2

謝謝,MEM_TOP_DOWN標誌非常有趣。我正在工作的項目有一個自定義調試分配器,所以剛纔我修改了使用標誌。這是非常緩慢的,但我已經找到轉換錯誤。 –