NUM.OVERFLOW.DF
起こり得る数値のオーバーフローまたはラップアラウンド
NUM.OVERFLOW.DF チェッカーは、算術演算で、数値のオーバーフローまたはラップアラウンドの起こり得るケースを検出します。
脆弱性とリスク
数値のオーバーフロー条件は、未定義の動作につながる結果をもたらす可能性があります。さらに、オーバーフローにより、プログラムの信頼性とセキュリティを脅かす可能性があります。
脆弱コード例 1
#include <stdio.h>
void f()
{
unsigned short unA, unB;
unsigned short unRet = 0;
unA = 40000;
unB = 30000;
unRet = unA + unB;
}
上記の例では、unsigned short に 16 ビットを使用するプラットフォームで、算術演算 (加算) の結果が ‘unsigned short’ の範囲を超えているため、Klocwork は 9 行目で NUM.OVERFLOW.DF の欠陥を報告します。
修正コード例 1
typedef unsigned long long uint64_t;
typedef unsigned int uint32_t;
uint64_t foo(uint32_t x, uint32_t y) {
uint64_t z;
z = (uint64_t) ( x ) * y;
z = (uint64_t) ( y ) * 1000000U; //or: y*1000000ULL
return z;
}
準拠したソリューションでは、算術演算を実行する前に範囲を超えるかどうかをチェックすることで、加算演算が決してオーバーフローしないようになっています。
脆弱コード例 2
#include <stdio.h>
void g()
{
signed int lX, lY;
unsigned long long llZ = 0;
lX = 2000000000;
lY = 2000000000;
llZ = (unsigned long long)(lX * lY);
}
この例では、‘signed int’ が 32 ビット以下のプラットフォームで、'unsigned long long' へのキャストを続ける前に、乗算が最初に 32 ビット (‘signed int’) で実行され、オーバーフローを引き起こすため、Klocwork は 8 行目で NUM.OVERFLOW.DF の欠陥を報告します。
修正コード例 2
#include <stdio.h>
void g()
{
signed int lX, lY;
unsigned long long llZ = 0;
lX = 2000000000;
lY = 2000000000;
llZ = (unsigned long long) (lX) * lY;
}
上記の準拠した例では、変数 ‘lX’ は最初にアップキャストされたため、‘lY’ は自動的に昇格されることになり、‘unsigned long long’ (64 ビット) で乗算が実行されても、オーバーフローの結果にはなりません。
関連チェッカー
- NUM.OVERFLOW
-
MISRA.COMP.WRAPAROUND
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは機能を拡張できません。