bugprone-suspicious-realloc-usage¶
此检查查找 realloc
的用法,其中返回值被分配给与第一个参数传递的表达式相同:p = realloc(p, size);
这种结构的问题在于,如果 realloc
失败,它会返回一个空指针,但不会释放原始内存。如果没有其他变量指向它,原始内存块将不再可供程序使用或释放。无论哪种情况,p = realloc(p, size);
都表明编码风格不好,可以用 q = realloc(p, size);
代替。
指针表达式(在 realloc
处使用)可以是变量或数据结构的字段成员,但不能包含函数调用或未解析的类型。
在明显的情况下,当在 realloc
调用之前将用于 realloc 的指针分配给另一个变量时,不会发出警告。只有在 p = p
或 void *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
}