【发布时间】:2010-10-25 11:15:34
【问题描述】:
请检查以下代码:
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();
所有的 lints 都没有对此提出异议。 Valgrind 很高兴能找到这类东西.. 但实际上代码中的泄漏比最初分配指针的位置要晚得多。
感谢任何帮助,即使是“不,它不会那样做。”
编辑:
哇,感谢您如此快速而出色的回复!总而言之,以下是您的选择:
- -Wextra 能收集到 -Wall 没有的各种东西,包括 空/无用的语句。
- -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 ++)
...
再次感谢您的提示!
【问题讨论】:
标签: c gcc memory-leaks