Пожалуйста, ознакомьтесь со следующим кодом:
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 ++)
...
Еще раз спасибо за советы!