https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92116

            Bug ID: 92116
           Summary: Potential null pointer  dereference in
                    'gomp_acc_remove_pointer'
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Keywords: openacc
          Severity: normal
          Priority: P3
         Component: libgomp
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tschwinge at gcc dot gnu.org
                CC: jakub at gcc dot gnu.org, jules at gcc dot gnu.org,
                    msebor at gcc dot gnu.org
  Target Milestone: ---

As reported in
<http://mid.mail-archive.com/58cdb016-4c82-a271-cbc5-1ede344fdad3@gmail.com>:

| PS I tried compiling GCC with [a new] patch.  It fails in libgomp
| with:
| 
|    libgomp/oacc-mem.c: In function ‘gomp_acc_remove_pointer’:
|    cc1: warning: invalid use of a null pointer [-Wnonnull]
| 
| so clearly it's missing location information.  With
| -Wnull-dereference enabled we get more detail:
| 
|    libgomp/oacc-mem.c: In function ‘gomp_acc_remove_pointer’:
|    libgomp/oacc-mem.c:1013:31: warning: potential null pointer dereference
[-Wnull-dereference]
|     1013 |       for (size_t i = 0; i < t->list_count; i++)
|          |                              ~^~~~~~~~~~~~
|    libgomp/oacc-mem.c:1012:19: warning: potential null pointer dereference
[-Wnull-dereference]
|     1012 |       t->refcount = minrefs;
|          |       ~~~~~~~~~~~~^~~~~~~~~
|    libgomp/oacc-mem.c:1013:31: warning: potential null pointer dereference
[-Wnull-dereference]
|     1013 |       for (size_t i = 0; i < t->list_count; i++)
|          |                              ~^~~~~~~~~~~~
|    libgomp/oacc-mem.c:1012:19: warning: potential null pointer dereference
[-Wnull-dereference]
|     1012 |       t->refcount = minrefs;
|          |       ~~~~~~~~~~~~^~~~~~~~~
|    cc1: warning: invalid use of a null pointer [-Wnonnull]
| 
| I didn't spend too long examining the code but it seems like
| the warnings might actually be justified.  When the first loop
| terminates with t being null the subsequent dereferences are
| invalid:
| 
|        if (t->refcount == minrefs)
|         {
|           /* This is the last reference, so pull the descriptor off the
|              chain. This prevents gomp_unmap_vars via gomp_unmap_tgt from
|              freeing the device memory. */
|           struct target_mem_desc *tp;
|           for (tp = NULL, t = acc_dev->openacc.data_environ; t != NULL;
|                tp = t, t = t->prev)
|             {
|               if (n->tgt == t)
|                 {
|                   if (tp)
|                     tp->prev = t->prev;
|                   else
|                     acc_dev->openacc.data_environ = t->prev;
|                   break;
|                 }
|             }
|         }
| 
|        /* Set refcount to 1 to allow gomp_unmap_vars to unmap it.  */
|        n->refcount = 1;
|        t->refcount = minrefs;
|        for (size_t i = 0; i < t->list_count; i++)

Reply via email to