2017-10-13 95 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 + +数组。