EN JP CN

STRONG.TYPE.JOIN.ZERO

STRONG.TYPE.JOIN.ZERO

ゼロを持つ強い型の比較

チェッカーの STRONG.TYPE ファミリーは、プログラマーが行う強い型指定 (型が定義された抽象型) が違反または無視され、基礎となる ANSI 型セマンティックスが優先される状況を検出します。

STRONG.TYPE.JOIN.ZERO チェッカーは、バイナリ演算子を使用して強い型指定の値がゼロと比較されているインスタンスを検出します。

この規則では、ゼロは、強い型にキャストされたことがない任意のゼロ定数と定義されます。たとえば、チェッカーは次のものをゼロとみなします。

  • 0L
  • (int)0

チェッカーは、次の例はゼロとみなしません。

  • (SPEED)0
  • (SPEED*)0

脆弱性とリスク

ANSI 規格対応のコンパイラは、表面の (プログラマーが定義する) 型ではなく、基底型をチェックするだけであるため、このような指摘に関する警告を報告しません。この結果、論理エラーが発生する可能性があります。

脆弱コード例

1 typedef float Speed;
2
3 int main() {
4   Speed s;
5   if (s == 0) ; 
6   return 0;
7 }

Klocwork 異なる強い型の値 s がゼロと比較されていることを示す 5 行目にフラグを立てます。

修正コード例

1 typedef float Speed;
2
3 int main() {
4   Speed s;
5   if (s == (Speed) 0) ; 
6   return 0;
7 }

修正コードでは、2 つの強い型の値の間で比較が明確に行われます。