首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

sprintf 格式字符串漏洞:%0.*f 缺少精度參數導致緩衝區溢出

     編輯:關於C語言

問題現場

項目中一個不起眼的 sprintf 調用導致進程崩潰:

char aa[1024] = {0};
float f = 50.123456;
sprintf(aa, "%0.*f", f); // 缺少精度參數!

錯誤分析

%.*f 格式要求兩個參數:第一個是精度(int),第二個是浮點數。代碼中僅傳入 f,導致 sprintf 從棧上讀取垃圾值作為精度,輸出超長字符串,最終寫入超出 aa 緩衝區範圍,觸發緩衝區溢出。

正確用法

sprintf(aa, "%0.*f", 2, f); // 明確指定保留 2 位小數

運行對比

錯誤與正確輸出對比

錯誤調用輸出極長數字串;正確調用輸出 50.12。

教訓總結

  • 變參函數格式字符串與參數必須嚴格匹配。
  • 使用編譯器警告(-Wformat)與靜態分析工具檢查。
  • 優先考慮 snprintf 限制寫入長度。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved