c++ - 为什么 MSVC 编译器不检测 std::array 越界访问

标签 c++ arrays

我用 std::array 替换了一个旧式数组,但后来我意识到编译器(至少 MSVC)正在做较少的边界检查。考虑这段代码:

double myArray[10];
myArray[11] = 3.0;

std::array<double,10> myStdArray;
myStdArray[11] = 3.0;

对于myArray,报了一个警告:

warning C4789: buffer 'myArray' of size 80 bytes will be overrun; 8 bytes will be written starting at offset 88

对于 myStdArray,根本没有报告任何警告。

是编译器中的“错误”还是 std::array 的实现方式不允许报告此类警告?如果是这样,是否值得使用在这里似乎不太安全的 std::array...

最佳答案

myArray[11] 是编译器知道的语言内置功能,编译器可以发出警告。

myStdArray[11]myStdArray.operator[](11) 的缩写,这是一个函数调用,其中 11 很好参数类型的范围。对此的警告需要查看 operator[] 的函数体,这通常只有在函数被内联时才会发生。

此外,供应商扩展可以使 myStdArray.operator[](11) 定义明确,例如就像在 Debug模式下中止程序一样,在这样的实现中,非常很难获得有用的编译时警告。

但是,有了这样的扩展,增加的运行时安全性可能仍然比缺少编译时警告更重要。

关于c++ - 为什么 MSVC 编译器不检测 std::array 越界访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40584936/

相关文章:

javascript - JS中打印json数组

c++ - 将 char* 字符串参数打印到 UnicodeString 对象中

c++ - OpenGL 纹理不显示

c++ - 相同的代码在不同的机器上运行时间大不相同

javascript - UI 未检测到可观察数组

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

javascript - 将 javascript 对象数组转换为数组数组

c++ - 通过 stringstream 将数字分配给 char*

c++ - 使用ffmpeg example remuxing.c 录制rtmp 直播流到mp4 文件,它添加一个空的elst 框,如何禁止它?

javascript - 根据值查找最后嵌套 n 次的对象