如何安全地打破严格的别名规则?

问题描述 投票:0回答:1

已知以下示例违反了严格的别名规则,因此经过优化和未经优化会产生不同的结果:

int foo( float *f, int *i ) { 
    *i = 1;               
    *f = 0.f;            
   
   return *i;
}

int main() {
    int x = 0;
    
    std::cout << x << "\n";   // Expect 0
    x = foo(reinterpret_cast<float*>(&x), &x);
    std::cout << x << "\n";   // Expect 0?
}

但是通过不同类型的reinterpret_cast指针访问对象无论如何都是UB。

我现在想知道如何修改示例以仍然打破严格别名规则,但由于 reinterprect_cast 而没有 UB

c++ undefined-behavior strict-aliasing
1个回答
0
投票

严格别名规则和“UB from reinterpret_cast”之间实际上并没有

区别
:严格别名规则只是编译器对
reinterpret_cast
相关规则的名称,其优化假设代码是遵循该模式。 (特别是,您可以 evaluate
reinterpret_cast<float*>(&x)
,但您对结果唯一能做的就是将其直接转换回
int*
(或其他一些 similar 类型)。通过它存储是“违反严格的”别名”([basic.lval]/11)。)

© www.soinside.com 2019 - 2024. All rights reserved.