CERT.MEMCMP.PADDED_DATA
2 つのオブジェクトの間で memcmp() 関数を使用すると、パディングバイトが比較され、内容は比較されません。その使用に意味があるのは、パディングのないオブジェクトをコピーする場合のみです。CERT.MEMCMP.PADDED_DATA チェッカーは、memcmp() 関数を使用して比較されているオブジェクト内で、パディングデータを検索します。
脆弱性とリスク
memcmp() 関数はバイトごとに比較を行います。構造体をこのように比較すると、正しくない結果が生じる可能性があります。
軽減と防止
この問題を回避するには、パディングデータを伴う構造体の各フィールドを手動で比較する必要があります。
脆弱コード例
1 #include <string.h> 2 3 struct s { 4 char c; 5 int i; 6 char buffer[13]; 7 }; 8 9 void compare0(const struct s *left, const struct s *right) { 10 if ((left && right) && 11 (0 == memcmp(left, right, sizeof(struct s)))) { 12 /* ... */ 13 } 14 }
Klocwork は、12 行目で CERT.MEMCMP.PADDED_DATA の指摘を報告します。そこでは、パディングデータを含む 2 つの構造体の内容を比較するために、memcmp() 関数が使用されています。
修正コード例
1 <codeblock > 2 #include <string.h> 3 4 struct s { 5 char c; 6 int i; 7 char buffer[13]; 8 }; 9 10 void compare1(const struct s *left, const struct s *right) { 11 if ((left && right) && 12 (left->c == right->c) && 13 (left->i == right->i) && 14 (0 == memcmp(left->buffer, right->buffer, 13))) { 15 /* ... */ 16 } 17 }
この修正された例では、すべてのフィールドの比較が手動で行われているため指摘が回避され、パディングバイトの比較がなくなっています。