基礎知識 | 每日一練(115)
- 2019 年 10 月 4 日
- 筆記
學生:我怎樣才知道對於任意的 sprintf 調用需要多大的目標緩衝區?怎樣才能避免 sprintf() 目標緩衝區溢出?
小林:當用於 sprintf() 的格式串已知且相對簡單時, 你有時可以預測出緩衝區的大小。如果格式串中包含一個或兩個 %s, 你可以數出固定字元的個數再加上對插入的字元串的 strlen() 調用的返回值。
當格式串更複雜或者在運行前未知的時候, 預測緩衝區大小會變得跟重新實現 sprintf 一樣困難, 而且會很容易出錯。有一種最後防線的技術, 就是 fprintf() 向一塊記憶體區或臨時文件輸出同樣的內容, 然後檢查 fprintf 的返回值或臨時文件的大小,並提防寫文件錯誤。
如果不能確保緩衝區足夠大, 你就不能調用 sprintf(), 以防緩衝區溢出後改寫
其它的記憶體區。如果格式串已知, 你可以用 %.Ns 控制 %s 擴展的長度, 或者使用%.*s。
要避免溢出問題, 你可以使用限制長度的 sprintf() 版本, 即 snprintf()。