刚给红帽报告了一个神奇的 bug:int8_t/int16_t/int64_t 是 32 位的

2016-08-13 16:55:46 +08:00
 snnn

在某个特定的情况下,你的代码中的 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

2969 次点击
所在节点    C
20 条回复
hitmanx
2016-08-13 18:21:55 +08:00
#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__)?
snnn
2016-08-13 19:16:45 +08:00
@hitmanx 后面那个或。
defined __STRICT_ANSI__
snnn
2016-08-13 19:17:35 +08:00
@hitmanx 如果你有 centos 7 的话,也可以重现这个 bug 。我没试过 centos 6.
est
2016-08-13 19:33:31 +08:00
V 站最近看到最有技术含量的一个帖子。
mdzz
2016-08-13 19:34:46 +08:00
@est 哈哈哈哈哈哈
forcecharlie
2016-08-13 19:39:59 +08:00
换行稍微不注意就有 bug 了
Marfal
2016-08-13 19:46:30 +08:00
@est V 站今年最有技术含量的帖子。
skydiver
2016-08-13 19:53:12 +08:00
这几个类型在 cstdlib 里面,可是你并没有 include
vietor
2016-08-13 19:55:34 +08:00
你没定义对齐
snnn
2016-08-13 21:15:59 +08:00
@skydiver 然并卵。不信你把 stdint.h 放最后试一试。
snnn
2016-08-13 21:16:53 +08:00
@vietor 不是。这个和 alignment 没有关系。因为头文件中有
typedef int int64_t;
这样的。
skydiver
2016-08-13 21:20:22 +08:00
@snnn 所以只有在你这种特别的情况下才会触发这个 bug
skydiver
2016-08-13 21:22:16 +08:00
在 Fedora24 里试验了,也可以重现这个 bug
skydiver
2016-08-13 21:25:08 +08:00
@skydiver 我才看到楼主也是一样的系统……囧
skydiver
2016-08-13 21:26:54 +08:00
可以先 workaround 一下把 #include<stdint.h> 放到最前面结果就对了……
snnn
2016-08-14 09:54:11 +08:00
@skydiver 是。
lizhenda
2016-08-14 14:19:08 +08:00
这个厉害啊
hitmanx
2016-08-15 13:14:03 +08:00
@snnn 昨天居然把第二行给看漏了汗,现在明白你的意思了。
onlyhuochetou
2016-08-15 17:58:45 +08:00
确实是一个问题。
可是为什么不将  argp.h 写在 stdio.h 后面呢?
skydiver
2016-08-20 23:36:57 +08:00
glibc-2.23.1-10 里面已经修复了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/299080

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX