| 
  
 new_string_obj 
  | 
     ‘new_string_obj’: events 1-2 
|    53 | string_obj *new_string_obj (const char *str) |  
 |             ^~~~~~~~~~~~~~ |  
 |             | |  
 |             (1) entry to ‘new_string_obj’ |  
| [...] |  |  
|    59 |     = (string_obj *)alloc_obj (&str_type, sizeof (string_obj) + len + 1); |  
 |                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |  
 |                     | |  
 |                     (2) calling ‘alloc_obj’ from ‘new_string_obj’ |  
 
 |   
   | 
  
 alloc_obj 
  | 
     ‘alloc_obj’: events 3-4 
|    43 | base_obj *alloc_obj (type_obj *ob_type, size_t sz) |  
 |           ^~~~~~~~~ |  
 |           | |  
 |           (3) entry to ‘alloc_obj’ |  
| [...] |  |  
|    46 |   if (!obj) |  
 |      ~      |  
 |      | |  
 |      (4) following ‘true’ branch (when ‘obj’ is NULL)... |  
 
 |   
  | 
     ‘alloc_obj’: event 5 
|    47 |     return NULL; |  
 |            ^~~~ |  
 |            | |  
 |            (5) ...to here |  
 
 |   
  | 
     ‘alloc_obj’: event 6 
|    47 |     return NULL; |  
 |            ^~~~ |  
 |            | |  
 |            (6) ‘0’ is NULL |  
 
 |   
 |   
  | 
     ‘new_string_obj’: events 7-9 
|    59 |     = (string_obj *)alloc_obj (&str_type, sizeof (string_obj) + len + 1); |  
 |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |  
 |                     | |  
 |                     (7) returning to ‘new_string_obj’ from ‘alloc_obj’ |  
| [...] |  |  
|    67 |   str_obj->str_len = len; /* { dg-warning "dereference of NULL 'str_obj'" } */ |  
 |   ~~~~~~~~~~~~~~~~~~~~~~ |  
 |                    | |  
 |                    (9) dereference of NULL ‘str_obj’ |  
| [...] |  |  
|    70 |   return str_obj; |  
 |          ~~~~~~~      |  
 |          | |  
 |          (8) ‘str_obj’ is NULL |  
 
 |   
 |