g ++ Как получить предупреждение о игнорировании возвращаемого значения функции - PullRequest
26 голосов
/ 20 мая 2010

lint выдает предупреждение вроде:

foo.c XXX Warning 534: Ignoring return value of function bar()

Из ворса Руководство

534 Игнорирование возвращаемого значения функции

'Символ' (сравните с местоположением) A функция, которая возвращает значение называется только для побочных эффектов, как, для Например, в заявлении само по себе или левая сторона запятой оператор. Попробуйте: (void) function (); в вызвать функцию и игнорировать ее возвращение значение. Смотрите также fvr, fvo и fdr флаги в §5.5 «Параметры флага».

Я хочу получить это предупреждение, если оно есть, во время компиляции. Есть ли какая-либо опция в gcc / g ++ для достижения этой цели? Я включил -Wall, но, очевидно, этого не обнаружил.

Ответы [ 5 ]

27 голосов
/ 23 мая 2010

Спасибо WhirlWind и paxdiablo за ответ и комментарий. Вот моя попытка соединить кусочки в полный (?) Ответ.

-Wunused-result - соответствующая опция gcc. И включен по умолчанию . Цитирование со страницы параметров предупреждения gcc :

-Wno-unused-result

Не предупреждать, если вызывающая функция помечена атрибутом warn_unused_result (см. Атрибуты переменной ) не используют возвращаемое значение. По умолчанию -Wunused-result

Итак, решение заключается в применении атрибута warn_unused_result к функции.

Вот полный пример. Содержимое файла unused_result.c

int foo() { return 3; }

int bar() __attribute__((warn_unused_result));
int bar() { return 5; }

int main()
{
    foo();
    bar();    /* line 9 */
    return 0;
}

и соответствующий результат компиляции:

$gcc unused_result.c 
unused_result.c: In function ‘main’:
unused_result.c:9: warning: ignoring return value of ‘bar’, declared with attribute warn_unused_result

Обратите внимание, что необязательно иметь -Wunused-result , так как это значение по умолчанию. Может возникнуть соблазн явно упомянуть об этом, чтобы сообщить о намерении. Хотя это и есть благородное намерение, но после анализа ситуации мой выбор, однако, будет против. Потому что наличие -Wunused-result в опциях компиляции может вызвать ложное чувство безопасности / удовлетворения, что неверно, если только все функции в базе кода не квалифицированы как warn_unused_result.

17 голосов
/ 01 мая 2017

Начиная с C ++ 17, вы можете использовать атрибут [[nodiscard]] .

Пример:

[[nodiscard]] int bar() {
  return 42;
}
6 голосов
/ 20 мая 2010

-Wunused-result должен сделать это для вас. Это не одно из предупреждений - Стена включается:

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

К функции должен быть применен атрибут warn_unused_result (спасибо paxdiablo).

4 голосов
/ 23 марта 2016

Ответы об использовании __attribute__((warn_unused_result)) верны. GCC не так хорош в этой функциональности, хотя! Имейте в виду: он не будет предупреждать для типов не POD. Это означает, например, что если вы вернете класс с деструктором (или класс с переменными экземпляра с деструкторами), вы никогда не увидите предупреждение о игнорировании результата.

Соответствующая ошибка: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66177

Пример, где это терпит неудачу:

struct Error {
~Error();
};

__attribute__((warn_unused_result)) Error test();

int main()
{
    test();
    return 0;
}

Итак, не полагайтесь на это для типов возвращаемых данных, которые не очень просты.

0 голосов
/ 18 октября 2017

Я решил проблему следующим образом:

#define ignore_result(x) if (x) {}

тогда вместо (void)foo() используйте ignore_result(foo())

Затем код компилируется с -Wall просто отлично.

...