【发布时间】:2019-09-14 08:51:50
【问题描述】:
来自 ARM 架构的过程调用标准(§7.1.5):
编译器可能会忽略自动 除非函数调用,否则永远不会获取地址的变量 setjmp().
这是否意味着在以下代码中:
volatile int x = 8;
if (x == 1)
{
printf("can be optimised away??");
}
整个if范围可以优化出来吗?
这只是与标准相矛盾,对于初学者来说,易失性访问是可观察行为的一部分,必须像抽象机器代码一样执行:
§5.1.2.3:
对一致性实现的最低要求是:
对 volatile 对象的访问严格按照 抽象机的规则。
还有§6.7.3:
具有 volatile 限定类型的对象可以通过以下方式修改 实现未知或有其他未知的副作用。 因此任何引用此类对象的表达式都应为 严格按照抽象机的规则进行评估
有矛盾吗?如果是这样,PCS 与 C 标准相矛盾的合法性如何?
【问题讨论】:
-
为什么与标准相矛盾?如果没有人通过指针观察
x,那为什么还需要将其视为volatile? C 标准说:“在序列点,易失性对象是稳定的,因为之前的访问已经完成,而后续的访问还没有发生。”鉴于 PCS 设置的约束,这看起来可以满足。 -
The least requirements on a conforming implementation are: Accesses to volatile objects are evaluated strictly according to the rules of the abstract machine...能比这更简单吗?还有An object that has volatile-qualified type may be modified in ways unknown to the implementation or have other unknown side effects. Therefore any expression referring to such an object shall be evaluated strictly according to the rules of the abstract machine, -
我在 Godbolt 中找不到任何对其进行优化的编译器。示例 - godbolt.org/z/DlA4vs , godbolt.org/z/yUU6O9
-
How could x be modified in a way unknown to the compiler? -
我认为关键在于“对可变对象的访问严格按照抽象机的规则进行评估。” ARM 过程调用标准不适用于任何抽象机,仅适用于ARM 抽象机,因此可以优化出它知道的代码
x在其抽象机器的世界中无法访问。
标签: c arm language-lawyer volatile abi