ABV.MEMBER
バッファオーバーフロー - 構造体の配列インデックスが範囲外
ABV.MEMBER はクラスまたは構造体での配列範囲違反をチェックします。このチェッカーは、この状況の結果としてバッファオーバーフローが発生するどのコードにもフラグを立てます。このチェッカーは ABV.GENERAL から抽出されたもので、コードの構造体でしばしばオーバーフローが発生するため、このチェッカーをオフにしたい場合など、特定のバッファオーバーフロー状況を個別に検出します。
脆弱性とリスク
バッファオーバーフローの結果には、有効なデータの上書きや、恣意的および潜在的な悪意のあるコードの実行も含まれます。
脆弱コード例
1 typedef struct Data { 2 int kind; 3 char name[8]; 4 char ext[3]; 5 } Data; 6 7 void resetDefaults(Data *d) 8 { 9 d->kind = 0; 10 memset(d->name, 0, 11); 11 }
Klocwork は 10 行目について、配列 'd->name' がオーバーフローすることを指摘する、ABV.MEMBER レポートを生成します。名前と拡張子をゼロにすることが設計の意図ならば、このコードに問題はありません。そうでない場合は、次の例のように変更するのがベストでしょう。
修正コード例
1 typedef struct Data { 2 int kind; 3 char name[8]; 4 char ext[3]; 5 } Data; 6 7 void resetDefaults(Data *d) 8 { 9 d->kind = 0; 10 memset(d->name, 0, 8); 11 memset(d->ext, 0, 3); 12 }
修正コード例では、配列のサイズが変更され、配列 'd->name' は、'name' と'ext' 両方のエイリアスとして使用されません。
関連チェッカー
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは、Klocwork ナレッジベースを利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。