在C++中,"access"在严格混叠规则中意味着什么?
In C++, What does "access" mean in the strict aliasing rule?
3.10/10 说:
如果程序尝试通过以下类型之一以外的 glvalue 访问对象的存储值,则行为是未定义的:
但是,术语"访问"在任何地方都没有定义。在这种情况下,它是否意味着读取,或读取或修改?
在C标准中,它被明确定义为读取或修改。 然而,在 C++11 中,它似乎在不同的时间以不同的含义使用,例如:
1.9/8:
对易失性对象的访问严格根据抽象机器的规则进行评估。
显然,这是要阅读或修改的,但是在许多其他地方,例如 1.10/24:
- 访问或修改易失性对象,或
它被使用时好像它只意味着阅读。
它必须意味着读取和写入,否则规则将没有多大意义。考虑 http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html 中的示例:
float *P;
void zero_array() {
int i;
for (i = 0; i < 10000; ++i)
P[i] = 0.0f;
}
仅当编译器可以假定P[i]
别名都没有P
时,才能将上面的示例代码优化为memset
。但是考虑一个只从不允许的glvalue读取是UB的世界,那么即使P[i]
别名P
某些i
,上面的代码也不会调用UB——例如,如果有人P = (float *) &P;
,因为所有P
的读取都是完全合法的——它们都使用lvalue表达式P
。
编辑:CWG 第 1531 期直接切中要害。该问题于 2013 年 4 月移至 DR(缺陷报告)状态,但无论出于何种原因,该决议均不适用于工作文件。
我不声称自己是语言律师。然而。。。
我将短语"访问对象的存储值"解释为"读取对象的存储值"。
考虑到上一段,这种解释更有意义,该段谈到了修改对象。
9 如果表达式可用于修改它所引用的对象,则该表达式称为可修改表达式。尝试通过不可修改的左值或右值表达式修改对象的程序格式不正确。
相关文章:
- 此代码是否违反一个定义规则
- 生成文件不对文件使用隐式规则
- 变量可能尚未初始化[MIRA 2012规则9.1,强制性]
- 静态结构和一个定义规则
- 这行代码在C++类中意味着什么
- 尽管遵循了规则,内存泄漏在哪里
- 这是关于成员访问规则的正确摘要吗
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 增强精神解析器规则以检测语句中的特殊结尾
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- 寻找地理和伤害意味着超载
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- 为什么此指针值不能转换为整数的规则是什么?
- 在C++标准中做格式好意味着代码可以编译
- 传递通用函数,用于梯形规则的数值积分
- C++内存模型中的确切规则阻止在获取操作之前重新排序
- 模板如何影响C++中隐式声明的规则?
- 在C++中,"access"在严格混叠规则中意味着什么?
- 迭代器失效规则意味着线程安全吗?