G++ Как получить предупреждение об игнорировании возвращаемого значения функции
lint вызывает предупреждение:
foo.c XXX Warning 534: Ignoring return value of function bar()
Из руководства
534 Игнорирование возвращаемого значения функции
'Символ' (сравните с местоположением) A функция, возвращающая значение, является называется только для побочных эффектов, так как для Например, в заявлении само по себе или левая часть запятой оператор. Попробуйте: (void) function(); в вызывать функцию и игнорировать ее возвращение стоимость. Смотрите также fvr, fvo и fdr флаги в §5.5 "Параметры флага".
Я хочу получить это предупреждение, если оно есть, во время компиляции. Есть ли какой-либо вариант в gcc/g++ для этого? Я включил -Wall
, но, по-видимому, этого не обнаружил.
Ответы
Ответ 1
Благодаря WhirlWind и paxdiablo для ответа и комментариев. Вот моя попытка собрать фрагменты в полный (?) Ответ.
-Wunused-result
- соответствующая опция gcc. И он включен по умолчанию. Цитата из страница настроек gcc:
-Wno-unused-result
Не следует предупреждать, если вызывающая функция, помеченная атрибутом warn_unused_result
(см. Variable Attributes) не использует свое возвращаемое значение. По умолчанию используется -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
.
Ответ 2
-Wunused-result
должен сделать это за вас. Это не одно из предупреждений -Wall включает:
http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
У функции должен быть применен атрибут warn_unused_result (спасибо paxdiablo).
Ответ 3
Ответы об использовании __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;
}
Итак, не полагайтесь на это для возвращаемых типов, которые не очень просты.
Ответ 4
С С++ 17 вы можете использовать атрибут [[nodiscard]]
.
Пример:
[[nodiscard]] int bar() {
return 42;
}
Ответ 5
Я решил проблему следующим образом:
#define ignore_result(x) if (x) {}
затем вместо (void)foo()
используйте ignore_result(foo())
Затем код компилируется с -Wall
просто отлично.