首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么没有为这段代码生成严格别名警告?

为什么没有为这段代码生成严格别名警告?
EN

Stack Overflow用户
提问于 2010-09-29 06:27:18
回答 1查看 1.3K关注 0票数 4

我有以下代码:

代码语言:javascript
复制
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");
    }
}

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

代码语言:javascript
复制
gcc -c -std=c99 -Wstrict-aliasing=2 -Wall -fstrict-aliasing -O3 foo.c

我用的是GCC 4.5.0。我预计编译器会打印出警告:

代码语言:javascript
复制
 warning: dereferencing type-punned pointer will break strict-aliasing rules

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-29 07:34:22

GCC的-Wstrict-aliasing=2文档说(重点是我的):

级别2:积极、快速、不太精确。可能仍然有许多假阳性(虽然没有级别1那么多),以及很少的假阴性(但可能超过级别1)。与级别1不同的是,它只在地址被占用时发出警告。警告类型不完整。仅在前端运行。

看起来您的代码并不太复杂,所以我不确定为什么会有假阴性,但可能是因为您没有使用& address-of操作符来执行别名(这可能就是“只在地址被占用时发出警告”的意思)。

更新:

这是因为没有使用address-of运算符。如果我将以下代码添加到foo.c文件中:

代码语言:javascript
复制
int usefoo(void)
{
    struct B myB = {0};

    foo( &myB);

    return 0;
}

发出警告。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3817474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档