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_countfill_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
}