NUM.OVERFLOW.DF.UNBOUNDED

制約のない値に起因する数値オーバーフローまたはラップアラウンドの可能性

NUM.OVERFLOW.DF.UNBOUNDED チェッカーは、算術演算において数値オーバーフローやラップアラウンドが発生する可能性を検出します。具体的には、型の全範囲を取り得る制約のない(信頼できない)関数パラメータなど、制約のない値が関与することで境界値に達してしまうケースが対象となります。

このチェッカーは、NUM.OVERFLOW.DF と同じオーバーフロー解析メカニズムを使用しています。これら2つのチェッカーが報告する欠陥の集合は互いに重複しません:

  • NUM.OVERFLOW.DF は、信頼された境界におけるオーバーフローを報告します(例:具体的な定数値によって境界を超える場合など)。

  • NUM.OVERFLOW.DF.UNBOUNDED は、制約のないパラメータや、型の全範囲をフォールバック値とする値など、信頼できない値のみを経由して境界を超過するオーバーフローを報告します。

これらのケースを区別することで、具体的な値によって生じるオーバーフローとは独立して、信頼できないソースに起因するオーバーフローをトリアージしたり、抑制したりすることが可能になります。

脆弱性とリスク

数値オーバーフローが発生すると、未定義の動作につながる結果が生じる可能性があります。さらに、オーバーフローはプログラムの信頼性やセキ​​ュリティを損なう恐れがあります。

脆弱コード例

コピー
  unsigned char checkOverflowUnbounded(unsigned char c)
  {
      unsigned char r;
      r = (unsigned char)(c + 1);
      return r;
  }

この例では、Klocworkは4行目でNUM.OVERFLOW.DF.UNBOUNDEDという欠陥を報告します。変数cは制約のないパラメータであるため、その値はunsigned char型の全範囲である[0, 255]を取り得ます。したがって、式c + 1は256に達する可能性があり、これはunsigned char型の上限を超過することになります。この超過は信頼できない入力に起因して発生するため、NUM.OVERFLOW.DFではなくNUM.OVERFLOW.DF.UNBOUNDEDとして報告されます。

修正コード例

コピー
  unsigned char checkOverflowUnbounded(unsigned char c)
  {
      unsigned char r;
      if (c < 255U) {
          r = (unsigned char)(c + 1);
      } else {
          r = c;
      }
      return r;
  }

この準拠ソリューションは、加算の結果が unsigned char の範囲を超えないように保護します。

関連チェッカー

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。

拡張機能

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