程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 處理C語言之vfprintf的段錯誤

處理C語言之vfprintf的段錯誤

編輯:關於C

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

 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved