当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《gcc能准确捕捉到无用的条件吗?》经验,为你挑选了4个好方法。

请检查以下代码:

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 ++)
   ...

再次感谢您的提示!



1> Employed Rus..:
/* 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


@Matthew - 文档几乎不可能导航,因为它太大了.也许他们应该重复一点......
非常简洁.

2> Tom..:

深入研究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



3> JimG..:

试试-Wextra



4> Bill Lynch..:

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

以vim为例:

gg=G

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有