免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6302 | 回复: 3
打印 上一主题 下一主题

关于GCC的strict aliasing [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-03 12:40 |只看该作者 |倒序浏览
  1. int sock_if_set_ip_addr(int sock, char *ifname, unsigned char ip[4])
  2. {
  3.     struct ifreq ifr;
  4.     memset(&ifr, 0, sizeof(ifr));
  5.     strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
  6.     struct sockaddr_in *_addr = (struct sockaddr_in *)&ifr.ifr_addr;
  7. [color=Red]    _addr->sin_family = AF_INET;[/color]
  8.     memcpy(&_addr->sin_addr.s_addr, ip, 4);
  9.     if (ioctl(sock, SIOCSIFADDR, (void *)&ifr) < 0)
  10.     {
  11.         perror("ioctl(SIOCSIFADDR)");
  12.         return -1;
  13.     }

  14.     return 0;
  15. }
复制代码
红色的地方会产生一个编译告警:
  1. warning: dereferencing pointer ‘_addr’ does break strict-aliasing rules
复制代码
改为用如下代码是可以避免这个Warning的:
  1.     struct sockaddr_in addr;
  2.     addr.sin_family = AF_INET;
  3.     memcpy(&addr.sin_addr.s_addr, ip, 4);
  4.     memcpy(&ifr.ifr_addr, &addr, sizeof(addr));
复制代码
但这样一来,多了一次无用的拷贝。

在Makefile中关闭这个Warning风险太大,而关闭strict aliasing有些资料上说会使编译器的优化变差一些。
这里有没有某种写法可以既避免无用的操作又避免产生这个Warning,或者有没有仅在某处关闭某个Warning、
之后就打开它的方法(类似于pc-lint的单行屏蔽,把风险降到最低)。

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
2 [报告]
发表于 2012-09-04 10:55 |只看该作者
感觉这个warning是第6行

struct sockaddr_in *_addr = (struct sockaddr_in *)&ifr.ifr_addr;

强制类型转换造成的。

看了下手册http://gcc.gnu.org/onlinedocs/gc ... ml#Optimize-Options中关于-fstrict-aliasing的介绍,如果关掉这个优化,自然就没有警告,但可能会失去一些优化机会。我不确定,在打开这个选项的情况下,如果有上述的警告,会不会造成优化出错,生成错误的程序代码。如果是这样的话,我觉得还是改改代码为好。

论坛徽章:
0
3 [报告]
发表于 2012-09-10 11:51 |只看该作者
回复 2# EricFisher


    这个地方代码应该是没问题的,不过整体关闭这个优化或者关闭这个warning都不太合适,所以才想知道能否“临时”禁止这个warning,
好像VC是有这种功能的。

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
4 [报告]
发表于 2012-09-13 14:35 |只看该作者
临时是指的只针对该文件么?如果是的话,修改makefile,对该文件使用-fno-strict-aliasing关掉该优化,或者-Wstrict-aliasing=n(n取1,2,3)关掉该警告。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP