Почему функции, которые возвращают значения, могут быть вызваны без проверки возвращаемого значения? - PullRequest
2 голосов
/ 07 марта 2019

Я имею в виду, не присваивая ее значение переменной и используя ее.

Например:

int foo(void);
void main()
{
    foo();
}
int foo()
{
    return(5);
}

Почему я не могу получить предупреждение

Ответы [ 2 ]

7 голосов
/ 07 марта 2019

Многие функции возвращают значение и также выполняют побочные эффекты, но они часто используются только для своих побочных эффектов.

Например, printf() печатает вывод, а также возвращает количество напечатанных символов,Но в большинстве случаев возвращаемое значение неинтересно, поэтому мы нигде его не назначаем.fclose() возвращает индикатор успеха, но обычно программа ничего не может сделать, если она терпит неудачу, поэтому они не проверяют результат.

Было бы утомительно писать что-то вроде:

(void)printf(...);
(void)fclose(f);

все время, поэтому компиляторы обычно не предупреждают о вызове не пустых функций без использования результата.

В некоторых случаях это может быть проблемой.Есть некоторые функции, в которых вы действительно должны использовать возвращаемое значение, но это распространенная ошибка - не использовать его.Например, realloc() возвращает новый указатель, но многие начинающие просто предполагают, что он всегда будет изменять размер выделения, на которое указывает старый указатель.

Некоторые IDE, вероятно, имеют списки функций, о которых следует предупредить об этомпричина.Но компиляторы, как правило, не так точны.

3 голосов
/ 07 марта 2019

Вы не обязаны хранить или проверять значение, возвращаемое функцией, если не хотите.

Например, printf возвращает int, представляющее количество успешно написанных символов, но большую часть времени вы просто вызываете printf, чтобы получить вывод на экран; вас не волнует возвращаемое значение. Например:

printf("Hello World!\n");

Чаще встречается, чем:

if(printf("Hello World!\n") != 13)
    // printf failed

Тем не менее, существует множество инструментов статического анализа, которые могут обеспечить выполнение того кода, который вызывает определенные функции, для проверки их возвращаемых значений. SAL , с которым я больше всего знаком, позволяет аннотировать функцию с помощью _Check_return_ или _Must_inspect_result_, и если вы затем вызываете функцию аннотированный как таковой без проверки его возвращаемого значения, анализ выдаст предупреждение.

* * Пример тысяча двадцать-один: * * 1 022
_Must_inspect_result_
int foo()
{
    return 5;
}

int main(void)
{
    foo();
    return 0;
}

Выполнение анализа SAL для этого кода приводит к появлению предупреждающего сообщения:

C6031 Возвращаемое значение игнорируется: 'foo'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...