- 论坛徽章:
- 0
|
- int sock_if_set_ip_addr(int sock, char *ifname, unsigned char ip[4])
- {
- struct ifreq ifr;
- memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
- struct sockaddr_in *_addr = (struct sockaddr_in *)&ifr.ifr_addr;
- [color=Red] _addr->sin_family = AF_INET;[/color]
- memcpy(&_addr->sin_addr.s_addr, ip, 4);
- if (ioctl(sock, SIOCSIFADDR, (void *)&ifr) < 0)
- {
- perror("ioctl(SIOCSIFADDR)");
- return -1;
- }
- return 0;
- }
复制代码 红色的地方会产生一个编译告警:- warning: dereferencing pointer ‘_addr’ does break strict-aliasing rules
复制代码 改为用如下代码是可以避免这个Warning的:- struct sockaddr_in addr;
- addr.sin_family = AF_INET;
- memcpy(&addr.sin_addr.s_addr, ip, 4);
- memcpy(&ifr.ifr_addr, &addr, sizeof(addr));
复制代码 但这样一来,多了一次无用的拷贝。
在Makefile中关闭这个Warning风险太大,而关闭strict aliasing有些资料上说会使编译器的优化变差一些。
这里有没有某种写法可以既避免无用的操作又避免产生这个Warning,或者有没有仅在某处关闭某个Warning、
之后就打开它的方法(类似于pc-lint的单行屏蔽,把风险降到最低)。 |
|