bugprone-misplaced-operator-in-strlen-in-alloc

查找在 strlen()strnlen()strnlen_s()wcslen()wcsnlen()wcsnlen_s() 的参数中添加 1 而不是结果,并且该值用作内存分配函数(malloc()calloc()realloc()alloca())或 C++ 中的 new[] 运算符的参数的情况。即使这些函数(除了 new[] 运算符)之一被常量函数指针调用,该检查也能检测到错误情况。在 1 同时添加到参数和 strlen() 类函数的结果中的情况会被忽略,同样会被忽略的是整个加法运算被额外括号包围的情况。

C 示例代码

void bad_malloc(char *str) {
  char *c = (char*) malloc(strlen(str + 1));
}

建议的修复方法是将 1 添加到 strlen() 的返回值,而不是它的参数。在上面的示例中,修复方法应该是

char *c = (char*) malloc(strlen(str) + 1);

C++ 示例代码

void bad_new(char *str) {
  char *c = new char[strlen(str + 1)];
}

与使用 malloc() 函数的 C 代码一样,建议的修复方法是将 1 添加到 strlen() 的返回值,而不是它的参数。在上面的示例中,修复方法应该是

char *c = new char[strlen(str) + 1];

用于消除诊断的示例

void bad_malloc(char *str) {
  char *c = (char*) malloc(strlen((str + 1)));
}