严格别名违规

时间:2016-06-23 17:23:55

标签: c++ strict-aliasing

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

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

2 个答案:

答案 0 :(得分:5)

  

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

是的,确实如此。您使用double*取消引用&dstd::int64_t*)。

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

auto& n{*nptr};

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

答案 1 :(得分:5)

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

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