Bug path

test_1
‘test_1’: events 1-2
83void test_1 (const char *str)
^~~~~~
|
(1) entry to ‘test_1’
84{
85 string_obj *obj = new_string_obj (str);
~~~~~~~~~~~~~~~~~~~~
|
(2) calling ‘new_string_obj’ from ‘test_1’
new_string_obj
‘new_string_obj’: events 3-4
53string_obj *new_string_obj (const char *str)
^~~~~~~~~~~~~~
|
(3) entry to ‘new_string_obj’
[...]
59 = (string_obj *)alloc_obj (&str_type, sizeof (string_obj) + len + 1);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
(4) calling ‘alloc_obj’ from ‘new_string_obj’
alloc_obj
‘alloc_obj’: events 5-9
43base_obj *alloc_obj (type_obj *ob_type, size_t sz)
^~~~~~~~~
|
(5) entry to ‘alloc_obj’
44{
45 base_obj *obj = (base_obj *)malloc (sz);
~~~~~~~~~~~
|
(6) allocated here
46 if (!obj)
~
|
(7) assuming ‘obj’ is non-NULL
(8) following ‘false’ branch (when ‘obj’ is non-NULL)...
47 return NULL;
48 obj->ob_type = ob_type;
~~~~~~~~~~~~~~~~~~~~~~
|
(9) ...to here
‘new_string_obj’: event 10
59 = (string_obj *)alloc_obj (&str_type, sizeof (string_obj) + len + 1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
(10) returning to ‘new_string_obj’ from ‘alloc_obj’
‘test_1’: events 11-14
85 string_obj *obj = new_string_obj (str);
^~~~~~~~~~~~~~~~~~~~
|
(11) returning to ‘test_1’ from ‘new_string_obj’
86 //__analyzer_dump();
87 if (obj)
~
|
(12) following ‘true’ branch (when ‘obj’ is non-NULL)...
88 unref (obj);
~~~~~~~~~~~
|
(13) ...to here
(14) calling ‘unref’ from ‘test_1’
unref
‘unref’: events 15-17
73void unref (string_obj *obj)
^~~~~
|
(15) entry to ‘unref’
[...]
76 if (--obj->str_base.ob_refcnt == 0)
~
|
(16) following ‘false’ branch...
[...]
81}
~
|
(17) ...to here
‘test_1’: events 18-19
88 unref (obj);
^~~~~~~~~~~
|
(18) returning to ‘test_1’ from ‘unref’
89} /* { dg-bogus "leak" "" { xfail *-*-* } } */
~
|
(19) ‘obj’ leaks here; was allocated at (6)