Подтвердить что ты не робот

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, но, по-видимому, этого не обнаружил.

4b9b3361

Ответ 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 просто отлично.