Подтвердить что ты не робот

Может ли gcc точно поймать бесполезные условные обозначения?

Пожалуйста, ознакомьтесь со следующим кодом:

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:

Ничего себе, спасибо за такой быстрый и отличный ответ! Вкратце, вот ваши варианты:

  • -Wextra берет на себя все виды вещей, которые -Wall не включает, в том числе пустые/бесполезные утверждения.
  • -Wempty-body выбирает бесполезные утверждения, которые разрешены -Wextra (но может разорвать старые версии gcc, работает на 4.3.x)

Некоторые люди могут найти -Внешнее раздражение. У вас может быть сравнение между типами различной подписки, но вы знаете сравнение происходит только тогда, когда они одинаковы.

то есть.

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

Еще раз спасибо за советы!

4b9b3361

Ответ 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

Ответ 2

После углубления в руководство 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

Try -Wextra

Ответ 4

В качестве альтернативы компилятору я обнаружил, что запуск автоиндекса над кодом помогает найти эти ситуации.

В vim например:

gg=G

Ответ 5

В дополнение к вышесказанному, если вы обнаружите, что испытываете разочарование в поисках ошибки с использованием valgrind или аналогичного профайлера выполнения, вам, возможно, стоит подумать об использовании инструмента статического анализа, такого как lint. Лично я использую PC-LINT, который ловит все виды этих типов ошибок.