gcc能准确捕捉到无用的条件吗?

请检查以下代码:

if (foo->bar == NULL); foo->bar = strdup("Unknown"); 

我花了三个小时的最后一部分用Valgrind追捕那个泄漏,当我发现这个假的时候感觉非常愚蠢’;’。

我知道上面的代码是有效的C,但是我希望gcc能够告诉我是否使用条件作为语句。

有没有我可以通过的旗帜,这将有助于在未来发现这种类型的错误? 在我看来,gcc能够知道条件是否无用。

IE

 if (1 == 1); code_that_is_always_reached_since_conditional_is_a_statement(); 

这些棉绒也没有问题。 Valgrind非常适合找到这些类型的东西..但是泄漏实际上比代码最初分配的位置要晚得多。

任何帮助都表示赞赏,甚至“不,它不会那样做”。

编辑:

哇,谢谢你这么快速的回复! 总结一下,这是您的选择:

  • -Wextra接受了各种各样的东西 – 墙没有,包括空/无用的陈述。
  • -wempty-body接收无用语句,由-Wextra启用(但可以破坏旧版本的gcc,适用于4.3.x)

有些人可能会发现-Wextra很烦人。 您可能会对不同签名的类型进行比较,但您知道只有在它们相同时才会进行比较。

 int ret; unsigned int i; ret = foo(bar); /* foo() is known to return a signed errno on failure */ if (ret < 0) return 1; /* Enter GCC complaining that ret differs in signedness * (but you know it doesn't and get the urge to cast it) */ for (i = 0; i < ret; i ++) ... 

再次感谢您的提示!

 /* foo.c */ int main() { if (1) ; return 0; } gcc -Wextra -c foo.c foo.c: In function 'main': foo.c:2: warning: empty body in an if-statement 

深入研究gcc手册后:

 -Wempty-body Warn if an empty body occurs in an `if', `else' or `do while' statement. This warning is also enabled by -Wextra. 

正如其他一些海报所写,-Wextra应该这样做

示例代码:

 int main(){ if (0); printf("launch missiles"); return 0; } $gcc -Wempty-body foo.c warn.c: In function 'main': warn.c:5: warning: suggest braces around empty body in an 'if' statement 

试试-Wextra

作为编译器的替代方案,我发现在代码上运行自动压缩器有助于找到这些情况。

以vim为例:

 gg=G 

除了上述内容之外,如果您发现自己使用valgrind或类似的执行分析器寻找错误而感到沮丧,您应该考虑使用静态分析工具,例如lint 。 就个人而言,我使用的是PC-LINT ,可以捕获各种类型的bug。