printf简直是个地狱

今天我在spdylay这个项目中发现一个小BUG:

void print_timer()
{
  timeval tv;
  get_timer(&tv);
  printf("%s[%3ld.%03ld]%s",
         ansi_esc("\033[33m"),
         tv.tv_sec, tv.tv_usec/1000,
         ansi_escend());
}

其中timeval的定义如下:

struct timeval {
     time_t       tv_sec;   /* seconds since Jan. 1, 1970 */
     suseconds_t  tv_usec;  /* and microseconds */
};

这其中的问题是,suseconds_t到底是什么类型?长度是多少?

很不幸。在不同的OS下不同。在Cent OS 6下,它是8字节的long,在Mac OS X 10.8下,它是4字节的int。于是printf很可能就会读越界。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥