1. 程式人生 > >格式化輸出引起的程式崩潰

格式化輸出引起的程式崩潰

伺服器上的程式跑一段時間以後,程序就不存在了。
放開core檔案限制:ulimit -c unlimited
等待產生core檔案
分析core檔案
(gdb) bt
#0  0x008711d3 in strlen () from /lib/libc.so.6
#1  0x00840c0e in vfprintf () from /lib/libc.so.6
#2  0x008613f4 in vsnprintf () from /lib/libc.so.6
#3  0x00846ec5 in snprintf () from /lib/libc.so.6
#4  0x08050598 in CHashMDM::Add (this=0x8073000, domain=0x2f36925c "xn--chinaka%64s-.com", tFrstVst=1372868283,

    nHourAvgFrqncy=30) at ./src/CHashMDM.cpp:36
#5  0x0805244d in CTaskTime::Run (this=0x9d712d0) at ./src/CTaskTime.cpp:117
#6  0x080589f6 in ThreadRun (pThread=0x9d712d0) at src/common/thread.cpp:24
#7  0x0097d832 in start_thread () from /lib/libpthread.so.0
#8  0x008d2e0e in clone () from /lib/libc.so.6
(gdb) l CHashMDM.cpp:36
36              snprintf(Data.dm, sizeof(Data.dm), dm);


漏了格式化輸出:, "%s",導致snprintf把緊接著的引數domain當作格式化字串,遇到網址xn--chinaka%64s-.com時,把%64s當作格式化字元來解釋,
但又缺少了%64s的傳入引數,程式就崩潰了。

參考:

其實這是函式呼叫時少引數的低階錯誤,但是編譯器有合理的解釋而並未報錯。

不要依賴編輯器、編譯器。基本功要紮實。寫程式要專心。