bugprone-suspicious-realloc-usage

此检查查找 realloc 的用法,其中返回值被分配给与第一个参数传递的表达式相同:p = realloc(p, size); 这种结构的问题在于,如果 realloc 失败,它会返回一个空指针,但不会释放原始内存。如果没有其他变量指向它,原始内存块将不再可供程序使用或释放。无论哪种情况,p = realloc(p, size); 都表明编码风格不好,可以用 q = realloc(p, size); 代替。

指针表达式(在 realloc 处使用)可以是变量或数据结构的字段成员,但不能包含函数调用或未解析的类型。

在明显的情况下,当在 realloc 调用之前将用于 realloc 的指针分配给另一个变量时,不会发出警告。只有在 p = pvoid *q = p 形式的简单表达式在与 p = realloc(p, ...) 相同的函数中找到时才会发生这种情况。该赋值必须在调用 realloc 之前(但其他情况下在同一函数中的任何位置)。这种抑制仅适用于 p 是单个变量的情况。

示例

struct A {
  void *p;
};

A &getA();

void foo(void *p, A *a, int new_size) {
  p = realloc(p, new_size); // warning: 'p' may be set to null if 'realloc' fails, which may result in a leak of the original buffer
  a->p = realloc(a->p, new_size); // warning: 'a->p' may be set to null if 'realloc' fails, which may result in a leak of the original buffer
  getA().p = realloc(getA().p, new_size); // no warning
}

void foo1(void *p, int new_size) {
  void *p1 = p;
  p = realloc(p, new_size); // no warning
}