我认为这段代码应该对越界数组访问发出警告:
int foo() {
int x[10] = {0};
int *p = &x[5];
return p[~0LLU];
}
我知道标准不要求越界警告,但编译器会给出它们。我在问编译器在这里发出这样的警告是否正确。
为什么该代码应该被视为格式良好?
最佳答案
I think this code should warn about an out-of-bounds array access:
当您在非 VLA 数组 上执行此操作时,一个体面的编译器可以警告您(gcc 不会,但 clang 会:https://godbolt.org/z/lOvl5n)
对于这个片段:
int foo() {
int x[10] = {0};
return x[~0LLU]; // or x[40] to make it simpler, same thing
}
警告:
<source>:3:10: warning: array index -1 is past the end of the array (which contains 10 elements) [-Warray-bounds]
return x[~0LLU];
^ ~~~~~
编译器知道这是一个数组,知道大小,因此如果一切都是文字(非 VLA 数组和文字索引是先决条件),则可以检查边界
在你的例子中,编译器“丢失”的是你分配给一个指针(数组衰减到一个指针)
在那之后,编译器无法分辨数据的来源,因此它无法控制边界(即使在您的情况下,偏移量大得离谱/负数/其他)。专用的静态分析工具可能会发现问题。
关于c++ - 这不应该发出越界警告吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54238506/