相似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);

如此看來,溢出了,這種問題極易出現,並且不易發現。編譯器

相關文章
相關標籤/搜索