关于gcc 4.6.1错误的严格别名警告

Strict aliasling warning on gcc 4.6.1 bug

本文关键字:别名 警告 错误 gcc 关于      更新时间:2023-10-16

我试图用-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

但仍然没有警告。这是臭虫吗?

我重写了你的例子来产生一个关于违反严格混叠规则的警告:

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;
}

尽管如此,g++ 4.6只在使用-Wstrict-aliasing=2而不是-Wstrict-aliasing编译代码时显示警告。此外,它只显示main()中强制转换的警告,而不是foo()。但是我不明白为什么编译器会对这两种类型转换有不同的看法。