【发布时间】:2017-10-13 09:19:15
【问题描述】:
假设我有一个数组 A[10] 和一些其他变量
我将它初始化为
for(int i=0;i<20;i++) //intentionally 20
A[i]=0;
因此,当您运行此 LIBRARY 时,它将初始化数组而不会出现任何错误并且也可以访问,但 gdb 在其他地方提供核心转储(在我的情况下,它显示内存其他变量已更改)
为什么在数组初始化期间不提供核心转储?
【问题讨论】:
-
因为当你越界时,它会导致undefined behavior 有时似乎工作正常(直到它不起作用的那一刻)。如果你有 UB,那么猜测程序其余部分的行为是没有意义的。
-
至于如何发现此类问题,请考虑使用内存调试器(例如Valgrind),或者可能经常擅长发现此类问题的静态分析工具。我认为 GCC 也有一些选项可以在运行时添加边界检查。
-
在 gcc 和 clang 中,您可以使用地址清理程序进行边界检查:我认为您只需要添加 '-fsanitize=address' 来编译选项和 '-lasan' 到链接选项