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 行生成 ABV.MEMBER 报告,指出数组 d->name 将溢出。如果设计意图是将名称和扩展名归零,则此代码正常。否则,最好进行以下示例所示的更改。

修正代码示例

复制
   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 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。