严格的别名冲突

Strict aliasing violation

本文关键字:冲突 别名      更新时间:2023-10-16

以下程序是否违反了严格的别名规则?

#include <cstdint>
int main()
{
double d = 0.1;
//std::int64_t n = *reinterpret_cast<std::int64_t*>(&d); // aliasing violation
//auto n{*reinterpret_cast<std::int64_t*>(&d)}; // aliasing violation
auto nptr{reinterpret_cast<std::int64_t*>(&d)};
auto& n{*nptr};
++n;
}

VS2015、clang 或 gcc 未发出警告。

以下程序是否违反了严格的别名规则?

是的,确实如此。您正在使用std::int64_t*取消引用double*(&d)。

违反严格别名规则的行是:

auto& n{*nptr};

在处理该行时,编译器不一定知道如何设置nptr的值。在处理该行时,它是double*的别名这一事实并不明显。

是的,这违反了严格的混叠。您正在访问double类型的对象d,尽管指针nptr不是指向double或与之相关的任何类型的指针。

仅仅因为编译器不发出警告并不意味着它不是违规。严格产生的违规是 UB(因为它们是运行时行为的问题),因此不需要诊断。