CERT.MEMCMP.PADDED_DATA

在两个对象之间使用 memcmp() 函数时,它会比较填充字节,而不是比较内容。这只有在复制无填充的对象时才有意义。CERT.MEMCMP.PADDED_DATA 检查器会查找通过使用 memcmp() 函数来进行比较的对象中的填充数据。

漏洞与风险

memcmp() 函数会逐字节进行比较。在结构之间进行此类比较可能会产生不正确的结果。

缓解与预防

为避免此问题,应手动将包含填充数据的结构的每个字段进行比较。

漏洞代码示例

复制
  #include <string.h>
  
  struct s {
    char c;
    int i;
    char buffer[13];
  };
  
  void compare0(const struct s *left, const struct s *right) {
   if ((left && right) &&
       (0 == memcmp(left, right, sizeof(struct s)))) {
     /* ...*/
   }
 }

Klocwork 在第 12 行报告 CERT.MEMCMP.PADDED_DATA 问题,memcmp() 函数在该行中被用于比较两个包括填充数据的结构的内容。

修正代码示例

复制
   <codeblock >
   #include <string.h>
   
   struct s {
     char c;
     int i;
     char buffer[13];
   };
     
  void compare1(const struct s *left, const struct s *right) {
    if ((left && right) &&
        (left->c == right->c) &&
        (left->i == right->i) &&
        (0 == memcmp(left->buffer, right->buffer, 13))) {
      /* ...*/
    }
  }

在此修正代码示例中,因为手动进行所有字段的比较,所以避免了该问题,因此不再有任何填充字节比较。