snnn
V2EX  ›  C

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

  •  1
     
  •   snnn · Aug 13, 2016 · 3534 views
    This topic created in 3592 days ago, the information mentioned may be changed or developed.

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