繁体   English   中英

严格别名违规

[英]Strict aliasing violation

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

#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, clanggcc没有发出警告。

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

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

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

auto& n{*nptr};

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM