我在网上看到很多提及Clang的-Wformat=2
选项,有时与已知的-Wformat
(Xcode列为“Typecheck调用printf
的那个选项一起提及/ scanf
,虽然它现在涵盖了更多的字符串格式化API。
-Wformat
会有什么不同?答案 0 :(得分:5)
如果是,那么它与-Wformat有什么不同呢?
它是从GCC借来的,因为它被设计成适当的替代品。 GCC's description:
<强> -Wformat = 2 强>
启用-Wformat加上格式检查,不包含在-Wformat中。目前 相当于`-Wformat -Wformat-nonliteral -Wformat-security -Wformat-2000年”。
这回答了你的大部分问题。
这有什么用呢?
是。以下程序会发出不同的警告,具体取决于-Wformat=2
的存在(或不存在):
__attribute__((__format__ (__printf__, 1, 2)))
static void F(const char* const pString, ...) {
}
int main(int argc, const char* argv[]) {
F("", 0);
F(argv[0], 0);
const char str[] = "aaa";
F(str, 0);
F("%i", 0);
F("%i");
return 0;
}
注意:Clang会将-Wformat-security
转换为-Wformat
。
最后,我没有测试-Wformat-y2k
,但它被GCC定义为:
<强> -Wformat-2000年强>
如果指定了-Wformat,还会警告可能只产生两位数年份的strftime格式。