CXX.SUSPICIOUS_INDEX_CHECK.ZERO

CXX.SUSPICIOUS_INDEX_CHECK.ZERO チェッカーは、配列にアクセスする前にゼロに対する不審なインデックスチェックが存在していても、インデックス値が配列の上部境界に対してチェックされていない場合に欠陥を検出します。

脆弱性とリスク

配列がそのサイズを超えるインデックスにアクセスされる場合、データの破損、誤動作、またはクラッシュが発生する可能性があります。

軽減と防止

バッファオーバーフローを防ぐには、特定のインデックスの配列にアクセスする前に、インデックスが範囲の下限と上限内にあることを確認してください。

脆弱コード例

コピー
int get_index();
void foo() 
{
    int err = 0;
    const int SIZE = 10;
    int arr[SIZE];
    int index = get_index();
    if (index > 0) {
        arr[index]=10;
    }
}

配列にアクセスする前にゼロに対する不審なインデックスチェックが存在していても、インデックス値は配列の上部境界に対してチェックされていないため、Klocwork は 9 行目で CXX.SUSPICIOUS_INDEX_CHECK.ZERO をレポートし、8 行目の不審なインデックスチェックについてユーザーに警告します。

修正コード例

コピー
int get_index();
void foo()
{
    int err = 0;
    const int SIZE = 10;
    int arr[SIZE];
    int index = get_index();
    if (index >= 0 && index < 10) {
        arr[index] = 10;
    }
}

8 行目の制約「index >= 0 && index < 10」により不正な動作がすべて排除されるため、バッファオーバーフローは発生しません。