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