首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

GCC 編譯警告:format not a string literal —— printf 格式化字串安全性

     編輯:程式設計綜合問答

代碼

char *message = "This is the child\n";
printf(message); // 警告:format not a string literal

警告含義

printf 原型:int printf(const char *format, ...);。
編譯器發現第一個參數是 **變數指標** 而非 **字串字面值**,無法在編譯期檢查格式佔位符 (`%d`, `%s` 等) 與後續參數匹配。

風險

若 `message` 來自外部輸入 (如環境變數、配置檔),包含 `%s`、`%n` 等格式符,會導致 **格式化字串漏洞** (讀取/寫入任意記憶體)。

修正方式

  1. 固定格式字串:printf("%s", message); — 最推薦,零風險。
  2. 屬性標註 (GCC/Clang):__attribute__((format(printf,1,2))) 讓自定義包裝函數也受檢查。
  3. 編譯選項:-Wformat-security -Werror=format-security 將警告升級為錯誤,強制修復。

最佳實踐

  • **永遠使用字面值格式字串**:printf("%s", var);、printf("Value: %d", num);。
  • 日誌框架 (SLF4J/Log4j2) 內部已安全處理,業務代碼勿直接呼叫 printf 族函數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved