https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109123
Bug ID: 109123
Summary: Bogus warning: pointer used after 'realloc'
-Wuse-after-free
Product: gcc
Version: 12.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: manu at gcc dot gnu.org
Target Milestone: ---
```c
typedef long unsigned int size_t;
extern void *realloc (void *__ptr, size_t __size)
__attribute__ ((__nothrow__ , __leaf__)) __attribute__
((__warn_unused_result__)) __attribute__ ((__alloc_size__ (2)));
struct vector_objective;
typedef struct vector_objective vector_objective;
struct vector_objective { double *_begin; double *_end; double *_capacity; };
static inline size_t vector_objective_size(const vector_objective * v) {
return v->_end - v->_begin;
}
static inline size_t vector_objective_capacity(const vector_objective * v) {
return v->_capacity - v->_begin;
}
static inline void vector_objective_reserve(vector_objective * v, size_t n) {
size_t old_capacity = vector_objective_capacity(v);
size_t old_size = vector_objective_size(v);
if (n > old_capacity) {
v->_begin = realloc(v->_begin, sizeof(double) * n);
v->_end = v->_begin + old_size;
v->_capacity = v->_begin + n;
}
}
static inline void vector_objective_push_back(vector_objective * v, double x) {
if (v->_end == v->_capacity)
vector_objective_reserve (v, (vector_objective_capacity (v) == 0) ? 8 :
2 * vector_objective_capacity (v));
*(v->_end) = x;
v->_end++;
}
typedef struct {
vector_objective xy;
} eaf_polygon_t;
int
rectangle_add(eaf_polygon_t * regions, double lx)
{
vector_objective_push_back(®ions->xy, lx);
return 0;
}
```
With -Wall -c -O2 produces:
In function 'vector_objective_size',
inlined from 'vector_objective_reserve' at <source>:15:23,
inlined from 'vector_objective_push_back' at <source>:24:9,
inlined from 'rectangle_add' at <source>:38:5:
<source>:8:20: warning: pointer used after 'realloc' [-Wuse-after-free]
8 | return v->_end - v->_begin;
| ^
In function 'vector_objective_reserve',
inlined from 'vector_objective_push_back' at <source>:24:9,
inlined from 'rectangle_add' at <source>:38:5:
<source>:17:21: note: call to 'realloc' here
17 | v->_begin = realloc(v->_begin, sizeof(double) * n);
|
But the use occurs before not after the realloc.