2014-09-24 60 views
2

建議使用herehere以避免警告'格式化字符串不是字符串文字'一個應使用以下__attribute__代碼段的函數定義之前告訴鏘認爲,從printf家庭的功能之一是被調用的函數裏面?爲什麼在Clang中使用__attribute __((__ format__(__printf __,...)來避免格式​​化字符串不是字符串文字?

__attribute__((__format__ (__printf__, 3, 0))) 

我的問題是,爲什麼我看過官方文檔here但不能真正指出問題。

回答

4

問題是,它通常是一個漂亮的壞主意printf格式字符串傳遞任意輸入。一種類型不匹配,你得到Undefined Behavior land的單向票據(更不用說可怕的%n說明符,可能導致寫入任意內存不匹配)。

因此,如果您使用非文字(如果您使用字面格式字符串調用printf,他們會根據提供的參數檢查格式字符串),GCC和鏗會發出抱怨。 __attribute__((__format__ (__printf__,...)告訴編譯器,其中一個參數是printf格式字符串,並且會在調用該函數時導致應用檢查。由於編譯器知道函數被調用時將檢查格式字符串參數,因此它不會抱怨使用該參數作爲函數內的格式字符串。

相關問題