C/C++覆盖数组边界

Him*_*ury 1 c c++

什么是检测我覆盖数组绑定的错误的好方法?

int a[100];
for (int i = 0; i<1000; i++) a[i] = i;
Run Code Online (Sandbox Code Playgroud)

收集人们在其经验中用于发现此类错误的不同策略列表将会很有帮助.例如,从内存故障点开始执行回溯(对我来说,这通常不起作用,因为堆栈已损坏).

Oli*_*rth 6

Valgrind会非常可靠地发现这种事情!


Mar*_*ett 6

使用std :: vector,并使用.at() - 它总是检查范围 - 或使用[]并打开编译器中的范围检查.

编辑 - 如果你是一个c ++编译器,没有理由不使用std :: vector.它不比数组慢(如果你关闭边界检查)并且你可以使用与.size()和[]完全相同的循环 - 你不需要被复杂的迭代器吓跑


Eri*_*rik 5

  • 静态代码分析(例如lint)
  • 运行时内存分析(例如valgrind)
  • 避免固定大小的缓冲区,更喜欢动态大小的容器
  • 尽可能使用sizeof()而不是幻数

  • 容器类,至少在某些实现中,还在"调试模式"中检查[]访问.此外,容器类鼓励使用.size(),这是所述问题的核心 (2认同)