超出C++的界限和未定义的行为

我知道在 C++ 中访问缓冲区边界是未定义的行为。
这是来自 cppreference 的示例:

int table[4] = {};
bool exists_in_table(int v)
{
    // return true in one of the first 4 iterations or UB due to out-of-bounds access
    for (int i = 0; i <= 4; i++) {
        if (table[i] == v) return true;
    }
    return false;
}

但是,我在 c++ 标准中找不到相应的段落。
谁能指出我在标准中解释这种情况的具体段落?

回答

这是未定义的行为。我们可以并列几段经文来证实这一点。首先,我不会明确证明它,table[4]*(table + 4). 我们只需要问自己指针值的属性table + 4以及它与间接运算符的要求有何关系。

在指针上,我们有这样一段话:

[基础.化合物]

3指针类型的每个值都是以下之一:

  • 指向对象或函数的指针(该指针被称为指向该对象或函数),或
  • 超过对象末尾的指针 ([expr.add]),或
  • 该类型的空指针值,或
  • 无效的指针值。

我们的指针是第二个项目符号的类型,而不是第一个。至于间接运算符:

[expr.unary.op]

1一元 * 运算符执行间接操作:应用它的表达式应是指向对象类型的指针,或指向函数类型的指针,结果是引用表达式指向的对象或函数的左值。如果表达式的类型为“pointer to T”,则结果的类型为“ T”。

我希望通过阅读本段可以明显看出,该操作是为上一段中第一个项目符号描述的类别的指针定义的。

因此,我们将操作应用于未定义其行为的指针值。结果是未定义的行为。


以上是超出C++的界限和未定义的行为的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>