memset 等函数长度相关的参数不应有误
13.5 ID_badLength
对于 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
....
}
括号的错误嵌套也是常见的笔误。