c++ - 这不应该发出越界警告吗?

标签 c++ c

我认为这段代码应该对越界数组访问发出警告:

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/

相关文章:

c++ - ANN 库中的前向声明

c++ - 在递归函数中打印 C++ 中的累计和

c++ - 将 MFC 宏与模板一起使用

c - void 名称(类型名称1,类型名称2,类型名称3[名称1][名称2]);

c - C 结构体中的 Sizeof 指针

c - 为什么我在以下代码中收到缺少 ')' 标识符错误?

c++ - 如何通过ifstream打开文件时共享文件删除权限

c++ - 如何在模板函数中使用 C++ 字符串文字?

c - 锁定的页面是否由 pthreads 继承?

c++ - 为什么返回浮点值会改变它的值?