在某个特定的情况下,你的代码中的 int8_t/int16_t/int32_t/int64_t/uint8_t/uint16_t/uint32_t/uint64_t 都会变成 32 位的。比如你定义了一个结构体 struct MessageHeader{ int64_t messageId; int32_t messageType; };
结果,在同一个程序中,它一会儿是 12 个字节,一会儿是 8 字节。这样的奇妙问题足够让你 debug 很久……
问题出在 glibc 的 argp 这个烂玩意儿上: https://bugzilla.redhat.com/show_bug.cgi?id=1366830
1
hitmanx 2016 年 8 月 13 日
#ifndef __attribute__
/* This feature is available in gcc versions 2.5 and later. */ # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || \ defined __STRICT_ANSI__ # define __attribute__(Spec) /* empty */ # endif ... 能解释一下嘛,为什么(__GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))能成立?你的 gcc 版本比它要高啊。还有为啥__attribute__会没有定义过(#ifndef __attribute__)? |
4
est 2016 年 8 月 13 日 V 站最近看到最有技术含量的一个帖子。
|
6
forcecharlie 2016 年 8 月 13 日
换行稍微不注意就有 bug 了
|
8
skydiver 2016 年 8 月 13 日 via iPad
这几个类型在 cstdlib 里面,可是你并没有 include
|
9
vietor 2016 年 8 月 13 日 via Android
你没定义对齐
|
13
skydiver 2016 年 8 月 13 日
在 Fedora24 里试验了,也可以重现这个 bug
|
15
skydiver 2016 年 8 月 13 日
可以先 workaround 一下把 #include<stdint.h> 放到最前面结果就对了……
|
17
lizhenda 2016 年 8 月 14 日
这个厉害啊
|
19
onlyhuochetou 2016 年 8 月 15 日
确实是一个问题。
可是为什么不将 argp.h 写在 stdio.h 后面呢? |
20
skydiver 2016 年 8 月 20 日
glibc-2.23.1-10 里面已经修复了
|