将char数组转换为其他类型会违反严格别名规则吗?

时间:2016-12-23 09:25:36

标签: c++ language-lawyer compiler-warnings reinterpret-cast strict-aliasing

考虑这两个功能:

int f1()
{
  alignas(int) char buf[sizeof(int)] = {};
  return *reinterpret_cast<int*>(buf);
}

int f2()
{
  alignas(int) char buf[sizeof(int)] = {};
  char* ptr = buf;
  return *reinterpret_cast<int*>(ptr);
}

GCC警告说,第一个违反严格别名规则。但第二个是好的。

Clang毫无怨言地接受了这两件事。

警告是否合法?

1 个答案:

答案 0 :(得分:9)

警告是合法的。 f2不正常(它是未定义的行为),它只是不会引发警告。

我怀疑f2没有引发警告的原因是:

int f3()
{
    int i = 0;
    char *ptr = reinterpret_cast<char*>(&i);
    return *reinterpret_cast<int*>(ptr);
}

完全合法。您可以使用char*(或void*)作为“通用指针” - 只要您在访问之前转回到正确的类型。海湾合作委员会显然要小心避免警告f3,但不要警告f2

Clang没有对f1f2发出警告 - 但不是必须的。