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))) {
/* ...*/
}
}
在此修正代码示例中,因为手动进行所有字段的比较,所以避免了该问题,因此不再有任何填充字节比较。