1. 程式人生 > >處理C語言之vfprintf的段錯誤

處理C語言之vfprintf的段錯誤

C語言的段錯誤想必是每個人都遇到過,整理一下,以供學習之用。

今天我執行了一個程式,運行了很長時間後,段錯誤了,我定位了一下,原來是fprintf的問題,具體是vfprintf的問題。

Program received signal SIGSEGV, Segmentation fault. 0x0098735e in vfprintf () from /lib/libc.so.6

呼叫棧為:

#0  0x0098735e in vfprintf () from /lib/libc.so.6
#1  0x0098e3cf in fprintf () from /lib/libc.so.6
將fprintf換成printf就沒有問題了。

我開始認為是長度問題,導致溢位,後來我組合了各種方案,發現不是長度問題,原來是一個特殊的字元序列導致的問題,這個罪魁禍首就是%20這個字串,它會導致vfprintf不正常執行。%20其實就是空格的url編碼。

上述主要是因為可變引數列表和格式化字串的特性導致的,如%20s序列,它會認為是一個字串,但是我們並沒有傳入一個字串,所以程式就會有問題。一般來說只要字串中含有%,就算沒有段錯誤,也會出現很奇怪的輸出現象。

同理,sprintf由於也會呼叫vfprintf,所以應該同樣也會有問題。

作者:hongchangfirst