为什么 gcc 从 7.2 版开始停止警告严格别名违规?

问题描述

如果我使用 -O2 -Wall(或 -O3)将此代码编译到 gcc 7.1

#include <stdio.h>

int main (void)
{
  char array [4] = {0x11,0x22,0x33,0x44};
  unsigned int u32 = *(unsigned int*)array; // intentionally invoking strict aliasing UB here
  printf("%x\n",u32);
  return 0;
}

Godbolt

然后我得到有关未定义行为的诊断:

警告:取消引用类型双关指针会破坏严格别名规则[-Wstrict-aliasing]

这仅在启用优化时发生。

在 7.2 中,此警告消失并一直禁用至今。 7.2 中发生了什么使警告消失?与 gcc 一样,更改完全没有记录 - https://gcc.gnu.org/gcc-7/changes.html 没有说明对严格别名的更改。编译与否 -fstrict-aliasing 似乎也无关紧要。

7.2 中的行为是有意更改还是这是一个错误?是否有任何已知的错误报告?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)