bugprone-suspicious-memset-usage¶
此检查查找 memset()
函数调用中其参数可能存在的错误。考虑到函数为 void* memset(void* destination, int fill_value, size_t byte_count)
,涵盖以下情况
情况 1:填充值为字符 ``’0’``
用 ASCII 码 48 字符填充内存区域并不常见,可能意图是填充整数零。该检查提供用 0
替换 '0'
的建议。允许用 '0'
对字符指针进行 memset 操作。
情况 2:填充值被截断
Memset 在使用 fill_value
之前将其转换为 unsigned char
。如果 fill_value
超出无符号字符范围,它将被截断,内存将不会包含期望的模式。
情况 3:字节计数为零
在 byte_count
参数中使用字面量零调用 memset 可能是无意的,并将 byte_count
与 fill_value
交换。该检查建议交换这两个参数。
对应的 cpplint.py 检查名称:runtime/memset
。
示例
void foo() {
int i[5] = {1, 2, 3, 4, 5};
int *ip = i;
char c = '1';
char *cp = &c;
int v = 0;
// Case 1
memset(ip, '0', 1); // suspicious
memset(cp, '0', 1); // OK
// Case 2
memset(ip, 0xabcd, 1); // fill value gets truncated
memset(ip, 0x00, 1); // OK
// Case 3
memset(ip, sizeof(int), v); // zero length, potentially swapped
memset(ip, 0, 1); // OK
}