可以說我有一個數組A [10]和其他一些變量核心轉儲,但GDB不能它找到確切的位置
,我初始化它作爲
for(int i=0;i<20;i++) //intentionally 20
A[i]=0;
所以當你運行這庫,它將初始化陣列沒有任何錯誤和訪問也是可能的,但gdb給核心轉儲在其他地方(在我的情況下,它顯示內存爲其他變量)
爲什麼它沒有給數組初始化期間的核心轉儲?
可以說我有一個數組A [10]和其他一些變量核心轉儲,但GDB不能它找到確切的位置
,我初始化它作爲
for(int i=0;i<20;i++) //intentionally 20
A[i]=0;
所以當你運行這庫,它將初始化陣列沒有任何錯誤和訪問也是可能的,但gdb給核心轉儲在其他地方(在我的情況下,它顯示內存爲其他變量)
爲什麼它沒有給數組初始化期間的核心轉儲?
在c/C++中,對於超出數組範圍的限制沒有保護,只要訪問不屬於進程的內存,就會發生崩潰。 所以只要你超出界限,只能在堆棧或堆中像其他變量一樣寫入自己的內存......程序不會崩潰,但其他變量將被更改,並且如果通過此更改指針這可能會導致未來的崩潰,因爲指針會指向某個隨機內存地址
有時,當你編寫嵌入式或內核代碼,不存在「不屬於該進程的內存」這樣的事情,所以你從未獲得訪問衝突。 –
在編譯時,僅在運行期間,沒有對POD(如原始數組)進行超出界限的錯誤檢查。您正在調用undefined behaviour。這是說喜歡std::vector或std::array原始(C風格)在C + +數組。
因爲當你走出界限,它會導致[*未定義的行爲*](http://en.cppreference.com/w/cpp/language/ub)有時似乎工作正常(直到時刻它不)。如果你有UB,那麼就沒有必要猜測其他程序的行爲。 –
至於如何找到這樣的問題,可以考慮使用內存調試器(例如[Valgrind](http://valgrind.org/)),或者可能是靜態分析工具,這些工具通常很擅長髮現這些問題。我認爲GCC也有一些選項可以在運行時添加邊界檢查。 –
在gcc和clang中,你可以使用地址清理器進行邊界檢查:我認爲你只需要添加'-fsanitize = address'來編譯選項和'-lasan'來鏈接選項 –