首页 > 其他 > 详细

类似sprintf这类变参可能出现的bug

时间:2014-01-17 09:09:29      阅读:458      评论:0      收藏:0      [点我收藏+]

  中午吃完饭照例去云风大神的blog上去逛一圈,果然有新发现,如题:

1     char buff[3];
2     char data;
3     sprintf(buff, "%02x", data);

  咋一看,data最大等于0xff应该不会错,可以如果编译器默认char为signed char,而且data = -1,以十六进制看应该为0xff,这么看也没有错。

  关键在于变参,在C语言的变参中,小于int长度的数据压栈时一律扩展为int型,很显示int是有符号的,那么问题来了,符号型数据在进行类型扩展时是会扩展符号的,这么看其实

data = -1;
sprintf(buff, "%02x", data);
//(int)-1的16进制等效于0xffffffff,因此等效于下面这句话
sprintf(buff, "%02x", 0xffffffff);

如果看来,溢出了,这种问题极易出现,而且不易发现。

类似sprintf这类变参可能出现的bug

原文:http://www.cnblogs.com/findstr/p/3523184.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!