Может ли gcc точно отловить бесполезные условные выражения? - PullRequest
17 голосов
/ 12 мая 2009

Пожалуйста, проверьте следующий код:

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

Я провел последнюю часть трех часов, выслеживая эту утечку с Вальгриндом, чувствуя себя очень глупо, когда я обнаружил фальшивку ';'.

Я знаю, что приведенный выше код является допустимым C, однако мне бы хотелось, чтобы gcc мог сообщить мне, использую ли я условное выражение в качестве оператора.

Есть ли флаг, который я мог бы пройти, который помог бы определить этот тип ошибки в будущем? Мне кажется, что gcc сможет узнать, бесполезно ли условие.

IE :

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

Ни одна из нитей не имеет значения с этим либо. Valgrind великолепен, чтобы находить подобные вещи ... но утечка на самом деле была намного позже в коде, чем там, где указатель был изначально выделен.

Любая помощь приветствуется, даже "Нет, она этого не делает".

Edit:

Ух ты, спасибо за такой быстрый и отличный ответ! Подводя итог, вот ваши варианты:

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

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

* * +1034 т.е.
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 ]

32 голосов
/ 12 мая 2009
/* 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
8 голосов
/ 12 мая 2009

После глубокого изучения руководства gcc:

-Wempty-body
    Warn if an empty body occurs in an `if', `else' or `do while' statement. This warning is also enabled by
-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
7 голосов
/ 12 мая 2009

Попробуйте -Wextra

6 голосов
/ 12 мая 2009

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

В vim например:

gg=G
2 голосов
/ 12 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...