2014-10-20 126 views
1

我的一個朋友在試圖調試開始顯示「對齊陷阱」錯誤的代碼時遇到了大問題。全局結構由特定函數訪問時發生問題。「對齊陷阱」錯誤的含義是什麼?

經過對網絡的一些研究後,它仍不清楚「對齊陷阱」的含義是什麼。有人能給出一個解釋,特別注意通常會導致對齊陷阱的原因,以及通常會如何解決問題(不僅僅是關於如何使用調試器,還包括問題本身)?

這一切都是在帶有嵌入式Linux的ARM處理器(OMAP L138)中的C代碼中完成的。

注意:我不是想用這個答案得到一個針對錯誤的解決方案建議,但是,正如問題標題所暗示的那樣,理解什麼是「對齊陷阱」錯誤意味着什麼。這就是爲什麼我不打算放置源代碼或類似的東西。

+1

請添加定義結構和訪問功能的代碼。 – user694733 2014-10-20 11:19:25

+0

@ user694733嗯,我不確定這是否會使它偏離主題。我並不是在尋求針對這個問題的針對錯誤的解決方案,而是爲了理解「對齊陷阱」意味着什麼以及它將如何被普遍解決的一般想法(Basile提供的答案正是我所想到的,回答這個問題)。在我讀到巴西爾的回答後,我只提到了結構性的東西來縮小範圍,並注意到這是一個相當廣泛的錯誤。 – Momergil 2014-10-20 11:26:01

+1

夠公平的。 Basiles的回答幾乎涵蓋了它。我個人會首先調查任何可能隱藏編譯器警告/錯誤的指針。這聽起來像一個天真的反序列化代碼。 – user694733 2014-10-20 11:35:38

回答

7

它是操作系統和處理器特定的(並且也是特定的ABI)。您有一些memory corruptionmemory leakbuffer overflow等,或者您正在解引用一些不良指針(未初始化或錯誤計算) - 例如,指向double的指針不是8的倍數(或者,在某些體系結構中,指向int的指針不是4的倍數),或者您可能正在跳轉到某個無效地址(例如指向錯誤的函數指針)。

在Linux上,我建議用gcc -Wall -g編譯和使用調試器(gdb)和valgrind。您可能有興趣使用-fsanitize=address-fsanitize=undefined編譯標誌(使用GCC 4.9)。它們都會生成(修改)生成的代碼。

閱讀關於undefined behavior。你肯定有一些。