EN JP CN

ABV.ITERATOR

ABV.ITERATOR

バッファオーバーフロー - 反復で配列インデックスが範囲外

ABV.ITERATOR は、配列と反復のポインターを使用して、範囲外の配列要素へのアクセスをチェックします。このチェッカーは、この状況の結果としてバッファオーバーフローが発生する可能性のあるどのコードにもフラグを立てます。

脆弱性とリスク

バッファオーバーフローの結果には、有効なデータの上書きや、恣意的および潜在的な悪意のあるコードの実行も含まれます。

脆弱コード例 1

1   int example1()
2   {
3       int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
4       int *p;
5       for (p = a ; p < a + 10; p++)
6       {
7           if (bar(*p) < 5)
8               break;
9       }
10       return *p;   // ABV.ITERATOR
11   }

Klocwork は 10 行目について、ポインター 'p' の値が配列 'a' の範囲を超える可能性を指摘する、バッファオーバーフローレポートを生成します。ポインター 'p' は 'a' に割り当てられ、5 行目で反復されています。この場合は反復により配列 'a' がその上限 10 を超える可能性があります。

修正コード例 1

1   int example1()
2   {
3       int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
4       int *p;
5       for (p = a ; p < a + 10; p++)
6       {
7           if (bar(*p) < 5)
8               break;
9       }
10      if (p < a + 10)
11        return *p;
12      return 0;
13   }

修正コード例では、10 行目で配列 'a' がオーバーフローしないことを確認するチェックが行われます。

脆弱コード例 2

1   int example2(int x)
2   {
3       int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
4       int *p = bar (a, x); //function returns a pointer to some element in "a"
5       if (p < a + 5)
6            return *p;
7   
8       return p[5]; // DEFECT: p[5] points to a[11] or beyond 
9   }

Klocwork は 8 行目について、配列 'a' が反復後にオーバーフローすることを指摘する、ABV.ITERATOR レポートを生成します。

修正コード例 2

1   int example2(int x)
2   {
3       int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
4       int *p = bar (a, x); //function returns a pointer to some element in "a"
5       if (p >= a + 5)
6            return *p;
7   
8       return p[5];  
9   }

修正コード例では、5 行目の構文が修正され、バッファオーバーフローが防止されています。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。