超出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”。
我希望通过阅读本段可以明显看出,该操作是为上一段中第一个项目符号描述的类别的指针定义的。
因此,我们将操作应用于未定义其行为的指针值。结果是未定义的行为。