【发布时间】:2012-02-08 02:59:40
【问题描述】:
我正在尝试在使用 GCC 编译特定程序时修复两个警告。警告是:
警告:取消引用类型双关指针会中断 严格别名规则 [-Wstrict-aliasing]
两个罪魁祸首是:
unsigned int received_size = ntohl (*((unsigned int*)dcc->incoming_buf));
和
*((unsigned int*)dcc->outgoing_buf) = htonl (dcc->file_confirm_offset);
incoming_buf 和 outgoing_buf 定义如下:
char incoming_buf[LIBIRC_DCC_BUFFER_SIZE];
char outgoing_buf[LIBIRC_DCC_BUFFER_SIZE];
这似乎与我一直在研究的其他警告示例略有不同。我宁愿解决问题,也不愿禁用严格别名检查。
有很多使用联合的建议 - 哪种联合可能适合这种情况?
【问题讨论】:
-
有趣...严格别名不应该适用于
char*。还是我错过了什么? -
@Mysticial 是的,您缺少的是当使用
T2类型的左值访问T1类型的对象时没有别名冲突@ 和T2是char,但是当T1是char并且T2不是char的有符号/无符号变体时,存在别名冲突。 -
@Mysticial:你搞错了!
标签: c strict-aliasing type-punning