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

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

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

  咋一看,data最大等于0xff应该不会错,能够若是编译器默认char为signed char,并且data = -1,以十六进制看应该为0xff,这么看也没有错。code

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

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

如此看来,溢出了,这种问题极易出现,并且不易发现。编译器

相关文章
相关标签/搜索