歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 處理C語言之vfprintf的段錯誤

處理C語言之vfprintf的段錯誤

日期:2017/3/1 9:55:29   编辑:Linux編程

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