歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

處理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,所以應該同樣也會有問題。

Copyright © Linux教程網 All Rights Reserved