什么-Wformat = 2呢?

Pet*_*sey 5 xcode warnings string-formatting clang compiler-warnings

我在Web上看到了很多关于-Wformat=2Clang选项的提及,有时与已知的-Wformat(Xcode列为"Typecheck调用printf/的那个"一起提及scanf,尽管它现在涵盖了更多的字符串格式化API).

  • 这有什么用呢?
  • 如果是的话,它有什么不同之处-Wformat呢?
  • 拥有两者,或者是另一个的超集是否有用?

jus*_*tin 6

如果是的话,它与-Wformat有什么不同呢?

它是从GCC借来的,因为它被设计成适合的替代品.海湾合作委员会的描述:

-Wformat = 2

-Wformat中不包括-Wformat plus格式检查.目前相当于`-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;
}
Run Code Online (Sandbox Code Playgroud)

注意:看起来Clang -Wformat-security卷入-Wformat.

最后,我没有测试过-Wformat-y2k,但它被GCC定义为:

-Wformat-Y2K

如果指定了-Wformat,也会警告strftime格式,这些格式可能只产生两位数的年份.