gpt4 book ai didi

c++ - "dereferencing type-punned pointer will break strict-aliasing rules"警告

转载 作者:IT老高 更新时间:2023-10-28 13:58:51 26 4
gpt4 key购买 nike

我使用了一个将 enum* 转换为 int* 的代码。像这样的:

enum foo { ... }
...
foo foobar;
int *pi = reinterpret_cast<int*>(&foobar);

编译代码(g++ 4.1.2)时,我收到以下警告消息:

dereferencing type-punned pointer will break strict-aliasing rules

我用谷歌搜索了这条消息,发现只有在严格的别名优化开启时才会发生这种情况。我有以下问题:

  • 如果我留下带有此警告的代码,它会生成潜在的错误代码吗?
  • 有没有办法解决这个问题?
  • 如果没有,是否可以从源文件内部关闭严格别名(因为我不想为所有源文件关闭它,也不想为这个源文件)?

是的,我确实需要这种别名。

最佳答案

按顺序:

  • 是的。 GCC 将假定指针不能别名。例如,如果您通过一个分配然后从另一个读取,作为优化,GCC 可能会重新排序读取和写入 - 我在生产代码中看到过这种情况,调试起来并不愉快。

  • 几个。您可以使用 union 来表示您需要重新解释的内存。您可以使用 reinterpret_cast。您可以在重新解释内存的位置通过 char * 进行转换 - char * 被定义为能够为任何内容设置别名。您可以使用具有 __attribute__((__may_alias__)) 的类型。您可以使用 -fno-strict-aliasing 全局关闭别名假设。

  • __attribute__((__may_alias__)) 使用的类型可能是最接近禁用特定代码部分的假设的方法。

对于您的特定示例,请注意枚举的大小定义不明确; GCC 通常使用可用于表示它的最小整数大小,因此将指向枚举的指针重新解释为整数可能会在结果整数中留下未初始化的数据字节。不要那样做。为什么不直接转换为适当大的整数类型?

关于c++ - "dereferencing type-punned pointer will break strict-aliasing rules"警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4163126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com