我正在回答一个问题并制作了这个测试程序。
#include <stdio.h>
int main()
{
volatile const int v = 5;
int * a = &v;
*a =4;
printf("%d\n", v);
return 0;
}
如果没有 volatile 关键字,代码会优化(使用 -O3 apple clang 4.2 编译)var 的变化,它按预期工作并且 const 变量被正确修改。
我想知道一个更有经验的 C 开发人员是否知道标准的一部分是否表明这是不安全的或 UB。
更新: @EricPostpischil 给了我这个标准报价
根据 C 2011 (N1570) 6.7.3 6,程序不得修改其自己的使用 const 限定类型定义的对象:“如果尝试通过使用左值来修改使用 const 限定类型定义的对象非 const 限定类型,行为未定义。” 外部代理可以修改具有 volatile 限定类型的对象,根据 6.7.3 7:“具有 volatile 限定类型的对象可能会以实现未知的方式进行修改或具有其他未知的副作用
我的程序违反了第一条规则,但我认为第二条规则可能会使程序免于第一条规则。
更新 2:
具有 volatile 限定类型的对象可能会以实现未知的方式被修改或具有其他未知的副作用。因此,任何引用此类对象的表达式都应严格按照抽象机的规则进行评估,如 5.1.2.3 中所述。此外,在每个序列点,最后存储在对象中的值应与抽象机规定的值一致,除非被前面提到的未知因素修改。134) 构成对具有 volatile 限定类型的对象的访问是实现-定义。
如果您查看此引用,您可以看到必须根据某些规则评估 var,我还没有通读所有部分5.1.2.3
,但我相信这可能会对这个问题有所帮助。