Ответ 1
/* 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
Пожалуйста, ознакомьтесь со следующим кодом:
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 отлично подходит для поиска таких вещей.. но утечка была на самом деле намного позже в коде, чем где первоначально был выделен указатель.
Любая помощь приветствуется, даже "Нет, она этого не делает".
Edit:
Ничего себе, спасибо за такой быстрый и отличный ответ! Вкратце, вот ваши варианты:
Некоторые люди могут найти -Внешнее раздражение. У вас может быть сравнение между типами различной подписки, но вы знаете сравнение происходит только тогда, когда они одинаковы.
то есть.
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
Try -Wextra
В качестве альтернативы компилятору я обнаружил, что запуск автоиндекса над кодом помогает найти эти ситуации.
В vim например:
gg=G
В дополнение к вышесказанному, если вы обнаружите, что испытываете разочарование в поисках ошибки с использованием valgrind или аналогичного профайлера выполнения, вам, возможно, стоит подумать об использовании инструмента статического анализа, такого как lint. Лично я использую PC-LINT, который ловит все виды этих типов ошибок.