V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
snnn
V2EX  ›  C

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

  •  1
     
  •   snnn · 2016-08-13 16:55:46 +08:00 · 2950 次点击
    这是一个创建于 3022 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    20 条回复    2016-08-20 23:36:57 +08:00
    hitmanx
        1
    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
        2
    snnn  
    OP
       2016-08-13 19:16:45 +08:00   ❤️ 1
    @hitmanx 后面那个或。
    defined __STRICT_ANSI__
    snnn
        3
    snnn  
    OP
       2016-08-13 19:17:35 +08:00
    @hitmanx 如果你有 centos 7 的话,也可以重现这个 bug 。我没试过 centos 6.
    est
        4
    est  
       2016-08-13 19:33:31 +08:00   ❤️ 3
    V 站最近看到最有技术含量的一个帖子。
    mdzz
        5
    mdzz  
       2016-08-13 19:34:46 +08:00
    @est 哈哈哈哈哈哈
    forcecharlie
        6
    forcecharlie  
       2016-08-13 19:39:59 +08:00
    换行稍微不注意就有 bug 了
    Marfal
        7
    Marfal  
       2016-08-13 19:46:30 +08:00
    @est V 站今年最有技术含量的帖子。
    skydiver
        8
    skydiver  
       2016-08-13 19:53:12 +08:00 via iPad
    这几个类型在 cstdlib 里面,可是你并没有 include
    vietor
        9
    vietor  
       2016-08-13 19:55:34 +08:00 via Android
    你没定义对齐
    snnn
        10
    snnn  
    OP
       2016-08-13 21:15:59 +08:00
    @skydiver 然并卵。不信你把 stdint.h 放最后试一试。
    snnn
        11
    snnn  
    OP
       2016-08-13 21:16:53 +08:00
    @vietor 不是。这个和 alignment 没有关系。因为头文件中有
    typedef int int64_t;
    这样的。
    skydiver
        12
    skydiver  
       2016-08-13 21:20:22 +08:00
    @snnn 所以只有在你这种特别的情况下才会触发这个 bug
    skydiver
        13
    skydiver  
       2016-08-13 21:22:16 +08:00
    在 Fedora24 里试验了,也可以重现这个 bug
    skydiver
        14
    skydiver  
       2016-08-13 21:25:08 +08:00
    @skydiver 我才看到楼主也是一样的系统……囧
    skydiver
        15
    skydiver  
       2016-08-13 21:26:54 +08:00
    可以先 workaround 一下把 #include<stdint.h> 放到最前面结果就对了……
    snnn
        16
    snnn  
    OP
       2016-08-14 09:54:11 +08:00
    @skydiver 是。
    lizhenda
        17
    lizhenda  
       2016-08-14 14:19:08 +08:00
    这个厉害啊
    hitmanx
        18
    hitmanx  
       2016-08-15 13:14:03 +08:00
    @snnn 昨天居然把第二行给看漏了汗,现在明白你的意思了。
    onlyhuochetou
        19
    onlyhuochetou  
       2016-08-15 17:58:45 +08:00
    确实是一个问题。
    可是为什么不将  argp.h 写在 stdio.h 后面呢?
    skydiver
        20
    skydiver  
       2016-08-20 23:36:57 +08:00
    glibc-2.23.1-10 里面已经修复了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5458 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 95ms · UTC 03:29 · PVG 11:29 · LAX 19:29 · JFK 22:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.