CERT.MEMCMP.PADDED_DATA

2 つのオブジェクトの間で 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 の指摘を報告します。そこでは、パディングデータを含む 2 つの構造体の内容を比較するために、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))) {
      /* ...*/
    }
  }

この修正された例では、すべてのフィールドの比較が手動で行われているため指摘が回避され、パディングバイトの比較がなくなっています。