在gcc 4.6.1 bug上严格的别名警告

时间:2011-12-18 17:37:19

标签: c++ gcc strict-aliasing

我正在尝试使用-pedantic-errors -pedantic -Wall -O2

在gcc上编译以下内容
#include <iostream>

void reset_uint32(uint32_t* pi)
{
    char* c = (char*)(pi);
    uint16_t* j = (uint16_t*)(c); // warning?
    j[0] = 0;
    j[1] = 0;
}

void foo()
{
    uint32_t i = 1234;
    reset_uint32(&i);
}

int main() {
   foo();
}

但我没有看到任何严格的别名警告。我也尝试启用

-fstrict-aliasing
-Wstrict-aliasing

但仍然没有警告。这是一个错误吗?

1 个答案:

答案 0 :(得分:1)

我重写了你的例子以产生关于违反严格别名规则的警告:

void foo(int* pi) {
    short* j = (short*)pi;
    j[0] = j[1] = 0;
}

int main() {
    int i = 1234;

    foo(&i);

    short* j = (short*)&i;
    j[0] = j[1] = 0;
}

即使如果使用-Wstrict-aliasing=2而不是-Wstrict-aliasing编译代码,g ++ 4.6也会显示警告。此外,它仅在main()中显示投射警告,而不是foo()。但是我看不出编译器如何/为什么会以不同的方式看待这两个演员。