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

       

Странные конструкции


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

*p++;

* ничего не дает. Такая конструкция вызывает сообщение lint'а:

null effect

В следующем фрагменте программы

unsigned x; . . . if (x < 0) . . .

условие никогда не будет выполнено. В таком случае lint выдает сообщение

degenerate unsigned comparison

Аналогично, для того же x, проверка

if (x > 0) . . .

эквивалентна

if (x != 0) . . .

Поэтому lint спрашивает:

unsigned comparison with 0?

Если программа содержит нечто, подобное фрагменту

if (1 != 0) . . .

lint выдает сообщение

constant in conditional context

поскольку сравнение 1 с 0 дает неизменный результат.

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

if (x&077 == 0) . . .



и

x<<2 + 40

имеют, скорее всего, совсем не тот смысл, который имелся в виду. Лучшее решение - использовать в таких выражениях скобки; к этому и призывает соответствующее сообщение lint'а.



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