【问题标题】:Why are no strict-aliasing warnings generated for this code?为什么没有为此代码生成严格别名警告?
【发布时间】:2010-09-28 22:27:18
【问题描述】:

我有以下代码:

struct A
{
    short b;
};

struct B
{
    double a;
};


void foo (struct B* src)
{
    struct B* b = src;
    struct A* a = (struct A*)src;

    b->a = sin(rand());

    if(a->b == rand())
    {
        printf("Where are you strict aliasing warnings?\n");
    }
}

我正在使用以下命令行编译代码:

gcc -c -std=c99 -Wstrict-aliasing=2 -Wall -fstrict-aliasing -O3 foo.c

我使用的是 GCC 4.5.0。我希望编译器打印出警告:

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

但从来都不是。对于其他情况,我可以打印出警告,但我想知道为什么在这种情况下不是这样。这不是打破严格别名规则的明显例子吗?

【问题讨论】:

  • ... -Wstrict-aliasing=1 ... 产生警告

标签: c gcc c99 gcc-warning strict-aliasing


【解决方案1】:

GCC 的 -Wstrict-aliasing=2 文档说(强调我的):

2 级:积极、快速、不过分 精确的。可能还有很多假的 积极因素(不如 1 级多) 虽然),并且很少有误报(但是 可能超过 1 级)。不像 1 级,它只在一个地址时发出警告 被采取。不完整的警告 类型。仅在前端运行。

您的代码似乎并不太棘手,所以我不确定为什么会出现误报,但可能是因为您没有使用 & 地址操作符来执行别名(这可能是“仅在获取地址时发出警告”的意思)


更新:

这是由于没有使用地址操作符。如果我将以下代码添加到 foo.c 文件中:

int usefoo(void)
{
    struct B myB = {0};

    foo( &myB);

    return 0;
}

发出警告。

如果usefoo() 在单独的编译单元中,则不会发出警告。

【讨论】:

  • 啊,是的,这很有意义。我错误地认为 -Wstrict-aliasing=2 是最高警告级别。谢谢!
猜你喜欢
  • 2021-06-13
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 2011-10-24
  • 2011-08-05
相关资源
最近更新 更多