2017-10-13 75 views
0

可以說我有一個數組A [10]和其他一些變量核心轉儲,但GDB不能它找到確切的位置

,我初始化它作爲

for(int i=0;i<20;i++) //intentionally 20 
    A[i]=0; 

所以當你運行這,它將初始化陣列沒有任何錯誤和訪問也是可能的,但gdb給核心轉儲在其他地方(在我的情況下,它顯示內存爲其他變量)
爲什麼它沒有給數組初始化期間的核心轉儲?

+0

因爲當你走出界限,它會導致[*未定義的行爲*](http://en.cppreference.com/w/cpp/language/ub)有時似乎工作正常(直到時刻它不)。如果你有UB,那麼就沒有必要猜測其他程序的行爲。 –

+0

至於如何找到這樣的問題,可以考慮使用內存調試器(例如[Valgrind](http://valgrind.org/)),或者可能是靜態分析工具,這些工具通常很擅長髮現這些問題。我認爲GCC也有一些選項可以在運行時添加邊界檢查。 –

+1

在gcc和clang中,你可以使用地址清理器進行邊界檢查:我認爲你只需要添加'-fsanitize = address'來編譯選項和'-lasan'來鏈接選項 –

回答

3

在c/C++中,對於超出數組範圍的限制沒有保護,只要訪問不屬於進程的內存,就會發生崩潰。 所以只要你超出界限,只能在堆棧或堆中像其他變量一樣寫入自己的內存......程序不會崩潰,但其他變量將被更改,並且如果通過此更改指針這可能會導致未來的崩潰,因爲指針會指向某個隨機內存地址

+1

有時,當你編寫嵌入式或內核代碼,不存在「不屬於該進程的內存」這樣的事情,所以你從未獲得訪問衝突。 –

0

在編譯時,僅在運行期間,沒有對POD(如原始數組)進行超出界限的錯誤檢查。您正在調用undefined behaviour。這是說喜歡std::vectorstd::array原始(C風格)在C + +數組。