什么-Wformat = 2呢?

时间:2013-03-02 05:16:15

标签: xcode warnings clang string-formatting compiler-warnings

我在网上看到很多提及Clang的-Wformat=2选项,有时与已知的-Wformat(Xcode列为“Typecheck调用printf的那个选项一起提及/ scanf,虽然它现在涵盖了更多的字符串格式化API。

  • 这有什么用呢?
  • 如果确实如此,那么它与-Wformat会有什么不同?
  • 两者都有用,或者是另一个的超集?

1 个答案:

答案 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格式。