代码之家  ›  专栏  ›  技术社区  ›  Tim Post Samir J M Araujo

GCC能准确捕获无用的条件吗?

  •  17
  • Tim Post Samir J M Araujo  · 技术社区  · 16 年前

    请检查以下代码:

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

    我花了三个小时的最后一段时间,用Valgrind寻找漏洞,感觉 非常 当我发现那个假的“;”的时候真傻。

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

    是否有一个标志可以让我通过,这将有助于发现这种类型的错误在未来?在我看来,GCC能够知道条件是否是无用的。

    工业工程 :

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

    所有的线头都不反对这一点。Valgrind能找到这些东西真是太棒了。但实际上,代码中的泄漏比最初分配指针的地方晚得多。

    任何帮助都会受到感激,即使是“不,它不会那样做”。

    编辑:

    哇,谢谢你这么快的反应!总而言之,以下是您的选择:

    • -韦克斯特拉发现了各种各样的东西——墙壁没有,包括 空/无用语句。
    • -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 ++)
       ...
    

    再次感谢您的提示!

    5 回复  |  直到 15 年前
        1
  •  32
  •   Employed Russian    16 年前
    /* 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
    
        2
  •  8
  •   Tom    16 年前

    在深入了解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
  •  7
  •   JimG    16 年前

    尝试- Wextra

        4
  •  6
  •   Nathan Fellman    16 年前

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

    例如,在VIM中:

    gg=G
    
        5
  •  2
  •   SmacL    16 年前

    除上述之外,如果您发现自己在使用Valgrind或类似的执行分析器查找bug时感到沮丧,那么您可能应该考虑使用静态分析工具,例如 lint . 我个人用 PC-LINT 它捕获各种类型的错误。