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` 等格式符,會導致 **格式化字串漏洞** (讀取/寫入任意記憶體)。
printf("%s", message); — 最推薦,零風險。__attribute__((format(printf,1,2))) 讓自定義包裝函數也受檢查。-Wformat-security -Werror=format-security 將警告升級為錯誤,強制修復。printf("%s", var);、printf("Value: %d", num);。printf 族函數。