2012-11-13 34 views
0

請原諒我沒有提供任何代碼,但是很難將C + P作爲摘錄,因爲錯誤是隨機產生的。EXC_BAD_ACCESS在使用GCC進行編譯時,Clang的工作原理是

我在編譯C源代碼時遇到了一個非常奇怪的錯誤。我正在爲Erlang開發一個鏈接驅動程序,我不明白是什麼導致了錯誤。錯誤是這樣的:

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_INVALID_ADDRESS at address: 0xffffffffb012aae8 
[Switching to process 7316 thread 0x1503] 
ktqk_exec (query=0x13e0af00, table=0x13e00ea0) at ktqk.c:215 
215 clock_t start = clock(); 

我正在運行用GDB包裝的Erlang虛擬機,所以我可以訪問內存部分。對我來說,高地址0xffffffffb012aae8看起來很可疑。然而,Clang的一切都按預期工作,沒有錯誤,沒有段錯誤。我試圖調查:

(gdb) p clock 
$1 = {<text variable, no debug info>} 0x7fff85c29fd0 <clock> 
(gdb) p start 
$2 = 2954013712 

所以這個值顯然沒有初始化,它之前崩潰了。當我在同一個文件中設置斷點時,它們被簡單地跳過。爲什麼一切與Clang一起工作,但與GCC無關?

由於Clang默認使用C99和GCC C89,因此我必須在GCC上包含-std=c99標誌進行編譯。可能這是一個潛在的來源?但是,當我註釋掉上面的代碼時,它在下次函數調用時失敗。所以它似乎與函數調用有關。儘管如此,在這條線之前的所有函數調用都很好。

一個非常奇怪的錯誤。有人有任何想法嗎?對不起,這個模糊的解釋,我根本不理解錯誤。

一切順利, 馬丁

+0

我投票結束這個,因爲它太本地化了。這個錯誤原來與問題本身中的文本完全無關,只是一個負數組索引。 – unwind

+0

是的,我可以關閉它,抱歉打擾! –

回答

0

我可以回答我的問題:這是導致錯誤的代碼可以發現如下:

... 
int select = -1; 

for (int p = 0; p < SIZE_KEYS; p++) 
    if (parts[p] == query->count && (select == -1 || sizes[p] < sizes[select])) 
    select = p; 

int *index[lists[select]]; 
if (select != -1) { 
    ... 
} 
... 

所以select被初始化爲-1,如果會發現一些東西,那應該是> 0。現在,在我的例子中沒有發現,所以select = -1。在lists中加上-1,結果也是lists[select] = -1,所以顯然是與select相同的內存區域。但是,現在我們正在初始化大小爲-1的整數指針列表。這顯然是錯誤的。

爲什麼克朗不會抱怨這種嚴重的錯誤!?

+0

據我所知,你並沒有將數組初始化爲負數,你正在訪問一個負索引元素,如果*(p-1)是完全定義好的,其中p是指向數組元素,定義良好。看看例如http://stackoverflow.com/questions/3473675/negative-array-indexes-in-c – rubenvb

+0

我不認爲'int * index [-1]'是一個堆棧變量的有效初始化。或者我錯了? –

+0

要麼我第一次誤讀,要麼我看到早期版本。我害怕前者。抱歉。 – rubenvb

相關問題