lint は、プログラマの意図には反するが、言語構造上は正しい箇所についても報告します。次に例を示します。
unsigned 変数は常に負ではない値を持ちます。そのため次のテストは
unsigned x; if (x < 0) ... |
常に失敗します。一方、
unsigned x; if (x > 0) ... |
これは次のように指定するのと同じことです。
if (x != 0) ... |
最初の例は意図したものではない可能性があります。lint は、負の定数または 0 と unsigned 変数との疑わしい比較を知らせます。unsigned 変数を負数のビットパターンと比較するには、その負数を unsigned にキャストします。
if (u == (unsigned) -1) ... |
または、接尾辞 U を使用します。
if (u == -1U) ... |
lint は、副作用が予想される状況で使用される副作用のない式、すなわちプログラマの意図に反した式を知らせます。代入演算子が予想されるところ、つまり副作用が予想されたところで等価演算子が存在する場合は追加の警告が発行されます。
int fun() { int a, b, x, y; (a = x) && (b == y); } |
lint は、論理演算子とビット単位の演算子 (具体的には、&、|、^、<<、>>) の両方が混在する式に括弧を入れるように注意を与えます。これは演算子の優先度を間違って解釈することにより、不正確な結果になる可能性があります。ビット単位の演算子 & の優先度は論理演算子 == より低いため、式はユーザーの意図とは異なる次のような式として評価されます。
if (x & a == 0) ... |
この式は、次のように評価されます。
if (x & (a == 0)) ... |
これは、ユーザーの意図とは異なる可能性が高いものです。-h を指定して lint を起動すると、診断のものは無効になります。