26 五月, 2006
sprintf的字符缓存越界
int sprintf(char *str, const char *format, ...);
要保证目标字符串缓存str的大小足够大。否则,会引起不可知错误。什么叫“不可知”,就是不可预测,就是让你很头晕,让你很后悔为啥要做一个程序员。
正在写的一个后台的服务进程,在收到SIGTERM(SIGKILL)信号的时候,结束所有的线程,释放所有的资源,并正常终止。然而昨天下午,这个服务突然不能被kill掉了。花了几个小时的debug,才发现原来错误就起源于一小段测试例程中的这个小小的不起眼的sprintf函数。缓冲区稍微小了那么几个字符,溢出覆盖了线程的数据区。而那些傻不拉唧的threads哪里知道它们的一亩三分地已经被人践踏,依旧照着这些莫名其妙的数据执行着莫名其妙的指令。结果是,我莫名其妙地浪费了很多时间。
建议:
- 尽量不要采用sprintf之类的需要主观确认缓冲区安全的函数,采用snprintf,或者asprintf之类的函数替代
- gcc/g++编译器最好能给出可能越界的Hint
发表评论



