请检查以下代码:
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