【发布时间】:2021-07-09 12:34:23
【问题描述】:
我知道在 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++ 标准中找不到相应的段落。
谁能指出我在标准中解释这种情况的具体段落?
【问题讨论】:
-
不适用于@RichardCritten,因为
table+4是一个有效的指针。调用 UB 的是它的间接性。 -
很确定this 是理由。它说元素 N-1 是数组中的最后一个对象,因此指向“对象 N”的指针实际上并不指向数组中的对象。
-
@YSC 标准并不总是明确地说明什么是是 UB;许多未指定的事情都暗示了它的省略(因此它是未定义的)。形成一个有效的指针并不意味着如果基础源不可访问,则可以取消引用该指针。为此,像定义数组这样简单的事情可能就足够了,比如[decl.array]/6,它声明只有从
0到N-1的元素存在于连续空间中。除此之外的任何东西都是不可访问的对象。
标签: c++ language-lawyer undefined-behavior