为什么要在Clang中使用__attribute__((__format__(__printf__,...)))以避免格式字符串不是字符串字面值?

4

建议在Clang中避免“格式字符串不是字符串文字”的警告,可以在函数定义之前使用以下 __attribute__ 代码段告诉Clang函数中调用了 printf 系列函数的一个。具体方法可参考这里这里

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

我的问题是为什么?我已经查看了官方文档(这里),但无法真正指出问题所在。

1个回答

9
重点在于,将任意输入作为printf格式字符串通常是一个相当糟糕的想法。一种类型不匹配就会让你前往未定义行为的地方(更不用说可怕的%n说明符,它可能导致写入不匹配的任意内存)。
因此,如果您使用非文字格式字符串调用printf,则GCC和clang会发出警告(如果您使用文字格式字符串调用它们,则会检查格式字符串是否与提供的参数匹配)。__attribute__((__format__(__printf__,...))告诉编译器,您的参数之一是printf格式字符串,并且在调用该函数时应用检查。由于编译器知道在调用函数时将检查格式字符串参数,因此它不会抱怨您在函数内部将该参数用作格式字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接