Операционная система UNIX. Руководство программиста

     

Значения функций


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

Если в теле функции встречается как оператор

return (выражение);

так и оператор

return ;

это настораживает; lint выдаст сообщение

function name has return(e) and return

Сложнее всего проанализировать тот возврат из функции, который происходит при достижении потоком управления ее конца. Рассмотрим пример.

f (a) { if (a) return (3); g (); }

Если условие ложно, f вызовет g, а затем завершится, не возвра- тив никакого определенного результата; такая конструкция будет причиной сообщения lint'а. Если g, подобно exit, никогда управ- ления не возвращает, сообщение тем не менее будет выдаваться, хотя на самом деле никакой ошибки нет. Комментарий

/* NOTREACHED */

в исходном тексте будет подавлять данное сообщение.

При анализе программы в целом lint выявляет ситуации, когда функция возвращает значения, которые иногда (или никогда) не используются. Если возвращаемые значения никогда не используются, в определении функции имеется некоторая неэффективность. Можно "легально" проигнорировать результат функции при помощи явного преобразования к типу void, например

(void) fprintf (stderr, "Файл занят. Попробуйте позже!\n");

Игнорирование результата может быть просто проявлением дурного стиля (например, частичное отсутствие проверок неудачного завершения функции).

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



Содержание раздела