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

            Bug ID: 100371
           Summary: Fortran asynchronous I/O: ASAN (memory leak) + TASN
                    (potential dead lock) warning with
                    libgomp.fortran/async_io_*.f90
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: burnus at gcc dot gnu.org
                CC: jb at gcc dot gnu.org, jvdelisle at gcc dot gnu.org
        Depends on: 100352
  Target Milestone: ---

Follow up to PR100352

Shows up in GCC 10 and mainline/12 when running libgomp.fortran/async_io_*.f90
with "gfortran -fopenmp" and ...

(A)  -fsanitize=thread
WARNING: ThreadSanitizer: lock-order-inversion (potential deadlock)
(pid=2980290)

  Mutex M25 acquired here while holding mutex M24 in main thread:
    #2 insert_unit ../../../repos/gcc/libgfortran/io/unit.c:244  LOCK
(&u->lock);
  Mutex M24 previously acquired by the same thread here:
    #2 get_gfc_unit ../../../repos/gcc/libgfortran/io/unit.c:332  LOCK
(&unit_lock);
  Mutex M24 acquired here while holding mutex M25 in main thread:
    #2 close_unit_1 ../../../repos/gcc/libgfortran/io/unit.c:734  LOCK
(&unit_lock)
  Mutex M25 previously acquired by the same thread here:
    #2 get_gfc_unit ../../../repos/gcc/libgfortran/io/unit.c:380 TRYLOCK
(&p->lock)

 * * *

(B)  -fsanitize=address / -fsanitize=leak

* Direct leak of 80 byte(s) in 1 object(s) allocated from:
    #1 0x7ff684a15c54 in _gfortrani_enqueue_done_id
../../../repos/gcc/libgfortran/io/async.c:289

which is:
enqueue_done_id (async_unit *au, enum aio_do type)
...
  transfer_queue *tq = calloc (sizeof (transfer_queue), 1);
...
      au->tail->next = tq;
and should get freed in
  async_io (void *arg)
which looks okay.

* And I see a bunch of:
    #1 0x7f3da3491bb8 in _gfortrani_xmalloc
../../../repos/gcc/libgfortran/runtime/memory.c:38

(xmalloc is used throughout libgfortran/io/*.c)


(C) On the other hand, valgrind shows:
  All heap blocks were freed -- no leaks are possible
thus (B) might be a false positive.


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100352
[Bug 100352] [11/12 Regression] libgomp.fortran/async_io_1.f90   -O0  execution
test

Reply via email to