为什么"volatileQualifiedExpr + volatileQualifiedExpr"不一定是 C 中的 UB 而是C++中的 UB?
Why is "volatileQualifiedExpr + volatileQualifiedExpr" not necessarily UB in C but in C++?
当我今天阅读C标准时,它谈到了的副作用
访问易失性对象、修改对象、修改文件或调用函数那些操作都是的副作用
和C++标准说
访问由volatile glvalue(3.10)指定的对象、修改对象、调用库I/O函数或调用执行任何这些操作的函数都是副作用
因此,由于两者都禁止在同一标量对象上发生未排序的副作用,C允许以下操作,但C++使其成为未定义的行为
int a = 0;
volatile int *pa = &a;
int b = *pa + *pa;
我是否正确阅读了说明书?如果是的话,造成这种差异的原因是什么?
在这方面,我认为C和C++之间没有有效的变体。尽管排序的措辞各不相同,但最终结果是相同的:两者都会导致未定义的行为(尽管C似乎表明评估会成功,但结果未定义)。
C99(对不起,没有C11)第5.1.2.3.5段规定:
在序列点,volatile对象是稳定的,因为以前的访问是完整的和后续的访问尚未发生。
与5.1.2.3.2中的报价相结合将表明pa
的值在至少一次访问pa
时不会处于稳定状态。这在逻辑上是有意义的,因为编译器可以按任何顺序对它们求值,只需一次或同时(如果可能的话)。然而,它实际上并没有定义稳定的含义。
在C++11中,在1.9.13中明确引用了未排序的操作。则点15指示对同一操作数的这种未排序操作是未定义的。由于未定义的行为可以意味着发生任何事情,它可能比C的不稳定行为更强。然而,在这两种情况下,都不能保证你的表达结果。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- .cpp和.h文件中的模板专用化声明
- 反向给定链表中的K节点
- 正在查找文档以获得PS4平台的C++中的设备信息
- enum是C++中的宏变量还是整数变量
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 将字符串存储在c++中的稳定内存中
- 文本文件中的单词链表
- 递归函数计算序列中的平方和(并输出过程)
- 如何从C++中的依赖类型中获得它所依赖的类型
- C++中的"inline"关键字
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?
- 在未初始化的变量上使用复合赋值运算符(+=, ..)不是C++中的UB?
- 在Union UB中,写作超出了较小尺寸的成员的规模
- 为什么"volatileQualifiedExpr + volatileQualifiedExpr"不一定是 C 中的 UB 而是C++中的 UB?
- 有关如何通过 xvalue 访问对象值以引发 UB 的示例,如 C++11 标准中的 3.10/10 中所述
- 函数调用中的临时:UB
- C++11中的数据竞赛、UB和计数器
- 关于指针积分加法中的类型、溢出和 UB 的混淆