2014-05-08 17 views
1

有沒有辦法讓Clang,GCC或Visual Studio在內存訪問不對齊時發出運行時警告,最好還會發出源代碼位置?在未對齊的內存訪問上發出警告?

我需要找到包含未對齊訪問的巨大遺留源(我沒有自己編寫)中的所有點,然後將它們明確地包裝在過濾器中,這使它們對齊。

我需要這個將源代碼移植到會在未對齊訪問時破解的平臺。

+0

代碼是否有很多#pragma pack指令?他們是主要原因。 – cup

+1

您無法確定您的目標編譯器佈局結構或數據元素是否與您的pc編譯器一樣。那麼這個警告的價值是什麼? –

+3

「編譯器發出運行時警告」嗎?這應該如何工作? –

回答

0

GCC有the -Wcast-align option。但是,它會引發編譯時警告,而不是運行時警告,因爲編譯器無法引發運行時警告或錯誤。

如果您需要更多信息,我建議您閱讀this SO question,其中討論了未對齊的內存。

編輯:增加了關於GCC提高編譯時間而不是運行時警告的部分。

1

另一種替代方法是通過設置EFLAGS寄存器的位18(對齊檢查)來引發異常。如果您正在開發x86 [-64],並且代碼覆蓋率足夠,這可能是一種有用的運行時機制,可用於跟蹤未對齊的R/W。

用gcc /鐺:

__asm__ ("pushf\n\t" 
     "orl $ 0x40000, (%esp)\n\t" 
     "popf\n\t"); 

相關問題herehere。編譯時檢查也可能有用,但對動態地址無助。