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