☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

memset 等函数长度相关的参数不应有误

13.5 ID_badLength
目录 › next › previous

对于 memset、memcpy、memmove、memcmp 及同类函数,表示长度的参数不应存在常见笔误。

示例:

char buf[1024];
memset(buf, 1024, 0);  // Non-compliant

长度和填充值参数被写反是常见笔误,应改为:

memset(buf, 0, 1024);  // Compliant

又如:

int arr[1024];
memset(buf, 0, 1024);  // Rather suspicious
memset(buf, 1, 123);   // Non-compliant

memset 等函数的长度单位为字节,不应遗漏 sizeof 因子,应改为:

memset(buf, 0, 1024 * sizeof(int));  // Compliant
memset(buf, 1, 123 * sizeof(int));   // Compliant

又如(设 p 为对象指针):

memset(p, 0, sizeof(p));   // Non-compliant

应改为:

memset(p, 0, sizeof(*p));  // Compliant

sizeof 作用于指针并不能获取到对象的大小,可参见 ID_sizeof_pointer 的进一步讨论。

又如(设 a、b 是对象):

memset(&a, 0, sizeof(&a));   // Non-compliant
memcpy(&a, &b, sizeof(&a));  // Non-compliant

应改为:

memset(&a, 0, sizeof(a));    // Compliant
memcpy(&a, &b, sizeof(a));   // Compliant

这是常见的复制粘贴错误。

又如:

if (memcmp(&a, &b, sizeof(a) != 0)) {  // Non-compliant
    ....
}

长度参数不应为比较表达式,应改为:

if (memcmp(&a, &b, sizeof(a)) != 0) {  // Compliant
    ....
}

括号的错误嵌套也是常见的笔误。

参考

CWE-130 CWE-805
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.