g ++ 4.7严格别名检查无效

时间:2013-02-07 16:38:33

标签: c++ g++

当我使用g++ 4.7编译以下代码时。

g++ -Wall -fstrict-aliasing 

我会在第一次演员时收到警告:

warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]

第二次演员没有任何警告就没事了。任何人都可以帮助我理解为什么第一次演员会发出警告?

int main()
{
    char a [16];
    char * p = &a[0];

    //int i = *((int *)(&a[0])); //bad
    int j = *((int *)(p));  //ok
    return  0;
}

1 个答案:

答案 0 :(得分:4)

  

第二次演员没有任何警告就没事了。任何人都可以帮助我理解为什么第一次演员会发出警告?

这不是你应该问的问题。你应该问的问题是为什么第二次演员没有显示警告,即使它与第一次演员一样有问题。

没有针对(int *) p发出警告,因为p 可能,基于其类型,通过将指针指向int转换为{{1}而合法获得}}。但是,除非是这种情况,否则仍然不允许取消引用结果。即使你没有得到警告。

请注意,警告与可能“破坏”代码的优化无关。您的代码可能会收到警告并按预期工作。您的代码无法收到警告并失败。