Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 核心转储,但gdb无法找到其确切位置_C++_Gdb_Core - Fatal编程技术网

C++ 核心转储,但gdb无法找到其确切位置

C++ 核心转储,但gdb无法找到其确切位置,c++,gdb,core,C++,Gdb,Core,假设我有一个数组A[10]和一些其他变量 我将它初始化为 for(int i=0;i<20;i++) //intentionally 20 A[i]=0; for(int i=0;i在c/c++中,您没有保护运行超出数组边界,一旦您访问不属于该进程的内存,就会发生崩溃。 因此,只要你越界,像其他变量一样只在堆栈或堆中写入你自己的内存……程序不会崩溃,但其他变量会改变,如果你这样改变一个指针,这可能会导致将来的崩溃,因为指针会指向某个随机内存地址,在c/c++中,你没有prote对

假设我有一个数组A[10]和一些其他变量

我将它初始化为

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

for(int i=0;i在c/c++中,您没有保护运行超出数组边界,一旦您访问不属于该进程的内存,就会发生崩溃。

因此,只要你越界,像其他变量一样只在堆栈或堆中写入你自己的内存……程序不会崩溃,但其他变量会改变,如果你这样改变一个指针,这可能会导致将来的崩溃,因为指针会指向某个随机内存地址,在c/c++中,你没有prote对于超出数组边界的情况,一旦访问不属于该进程的内存,就会发生崩溃。
因此,只要您超出范围,只在堆栈或堆中写入自己的内存,就像其他变量一样…程序不会崩溃,但其他变量会发生更改,如果您通过此更改指针,这可能会导致将来的崩溃,因为指针将指向某个随机内存地址

,因此没有超出范围在编译时,仅在运行时,对原始数组进行错误检查。调用时,在C++中,您更喜欢调用原始的(C样式)数组。

在编译时,只有在运行时才有POD(如原始数组)的越界错误检查。C++中的数组。

因为当你进入界限时,它会导致有时看起来很好(直到它不存在)。如果你有UB,那么就没有必要猜测程序的其余部分。至于如何找到这样的问题,考虑使用内存调试器(例如)。,或者可能是静态分析工具,它们通常擅长于发现此类问题。我认为GCC还有一些选项可以在运行时添加边界检查。在GCC和clang中,您可以使用地址消毒器进行边界检查:我认为您只需要添加“-fsanize=address”来编译选项,并将“-lasan”添加到链接选项,因为当您退出边界,它有时导致看起来很好(直到它不存在)。如果你有UB,那么推测程序其余部分的行为是没有意义的。至于如何找到这样的问题,考虑使用内存调试器(例如)。,或者可能是静态分析工具,它们通常擅长于发现此类问题。我认为GCC也有一些选项可以在运行时添加边界检查。在GCC和clang中,您可以使用地址清理器进行边界检查:我认为您只需要添加“-fsanize=address”来编译选项,并将“-lasan”添加到链接选项,有时,当您需要时编写嵌入式或内核代码时,没有“不属于进程的内存”这样的东西,因此您永远不会遇到访问冲突。有时,在编写嵌入式或内核代码时,没有“不属于进程的内存”这样的东西,因此您永远不会遇到访问冲突。