5

我在网上看到很多关于-Wformat=2Clang 选项的提及,有时与已知的选项并列-Wformat(Xcode 将其列为“对printf/的 Typecheck 调用scanf,尽管它现在涵盖了更多的字符串格式化 API)。

  • 这有什么作用吗?
  • 如果确实如此,那么它的作用与 有什么不同(如果有的话)-Wformat
  • 两者兼有是否有用,或者其中一个是另一个的超集?
4

1 回答 1

6

如果有,它与 -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 格式。

于 2013-03-02T08:54:33.390 回答