我在网上看到很多关于-Wformat=2
Clang 选项的提及,有时与已知的选项并列-Wformat
(Xcode 将其列为“对printf
/的 Typecheck 调用scanf
,尽管它现在涵盖了更多的字符串格式化 API)。
- 这有什么作用吗?
- 如果确实如此,那么它的作用与 有什么不同(如果有的话)
-Wformat
? - 两者兼有是否有用,或者其中一个是另一个的超集?
我在网上看到很多关于-Wformat=2
Clang 选项的提及,有时与已知的选项并列-Wformat
(Xcode 将其列为“对printf
/的 Typecheck 调用scanf
,尽管它现在涵盖了更多的字符串格式化 API)。
-Wformat
?如果有,它与 -Wformat 有什么不同(如果有的话)?
它是从 GCC 借来的,因为它被设计为合适的替代品。GCC 的描述:
-W格式=2
启用 -Wformat 以及 -Wformat 中未包含的格式检查。目前相当于`-Wformat -Wformat-nonliteral -Wformat-security -Wformat-y2k'。
这回答了你的大部分问题。
这有什么作用吗?
是的。以下程序根据 的存在(或不存在)发出不同的警告-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-y2k
如果指定了 -Wformat,还会警告可能只产生两位数年份的 strftime 格式。