EN JP CN

NUM.OVERFLOW

NUM.OVERFLOW

間違った型キャストによる数値オーバーフロー

NUM.OVERFLOW チェッカーは、変数が不正確に型キャストされたときのオーバーフローイベントを検出します。

脆弱性とリスク

間違った型キャストによる数値オーバーフローは、不正確な結果につながる可能性があります。また、デバッグによる追跡も困難です。不正確な結果は通常、より大きな式の中の部分式として表示され、これらによって生成されるオーバーフロー値を使った作業は簡単ではありません。これらの問題を回避するには、演算子優先を注意深く調べて複合式に適用する必要があります。チェッカーは、不正確に実行された明示的な型キャストが存在する場合にのみ開始されます。

脆弱コード例

1  typedef unsigned long long uint64_t;
2  typedef unsigned int uint32_t;
3  uint64_t foo(uint32_t x, uint32_t y) {
4    uint64_t z;
5    z = (uint64_t) ( x * y );
6    z = (uint64_t) ( y * 1000000U );
7    return z;
8  }

上の例の 5 行目と 6 行目で、デベロッパーはオペランドが両方 32 ビットの場合でも、乗算演算の結果が 64 ビットになると想定しています。乗算は最初に (オーバーフローの原因となる) 32 ビットで実行され、その後にアップキャストが続くため、両方の行に不正確な型キャストが含まれます。Klocwork は 5 行目と 6 行目で NUM.OVERFLOW を生成します。

修正コード例 1

1  typedef unsigned long long uint64_t;
2  typedef unsigned int uint32_t;
3  uint64_t foo(uint32_t x, uint32_t y) {
4    uint64_t z;
5    z = (uint64_t) ( x ) * y;
6    z = (uint64_t) ( y ) * 1000000U; //or: y*1000000ULL
7    return z;
8  }

5 行目で変数 ‘x’ が最初にアップキャストされます。これにより、‘y’ が自動的に昇格し、完全な 64 ビット乗算になります。定数 (6 行目) で後置 (この場合は ULL) が適切に使用された場合、‘y’ も昇格するようコンパイラに指示します。

脆弱コード例 2

1  typedef unsigned long long uint64_t;
2  typedef unsigned int uint32_t;
3  uint32_t get_val();
4  uint64_t foo(uint32_t x, uint32_t y) {
5    uint64_t z;
6    z = (uint64_t) ( y * get_val() );
7    return z;
8  }

上記の例で、6 行目に類似した問題が示されていますが、今回は関数呼び出しを伴っています。

修正コード例 2

1  typedef unsigned long long uint64_t;
2  typedef unsigned int uint32_t;
3  uint32_t get_val();
4  uint64_t foo(uint32_t x, uint32_t y) {
5    uint64_t z;
6    z = (uint64_t) ( y ) * get_val();
7    return z;
8  }

拡張機能

このチェッカーは機能を拡張できません。