Firm Bugtracker - libFirm
Viewing Issue Advanced Details
187 backend minor always 2016-12-07 12:35 2017-01-11 12:36
moben  
mohr  
normal  
resolved development  
fixed  
none    
none  
0000187: Leak in co_collect_units
we are building libfirm with LeakSanitizer (clang 3.9) and it is detecting a memory leak in co_collect_units.

The corresponding .vcg file is attached. The called function in the inner loop is empty.

LeakSanitizer output:


=================================================================
==10958==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 8 byte(s) in 1 object(s) allocated from:
    #0 0x5df618 in realloc /var/tmp/paludis/build/dev-libs-compiler-rt-3.9.0/work/compiler-rt-3.9.0.src/lib/asan/asan_malloc_linux.cc:77
    0000001 0x2b5773984bf7 in xrealloc /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/adt/xmalloc.c:36:20
    0000002 0x2b5773a1dcd4 in co_collect_units /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/be/becopyopt.c:406:17
    0000003 0x2b5773a3fc3a in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:39:2
    0000004 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000005 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000006 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000007 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000008 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000009 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000010 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    #11 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000012 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    #13 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000014 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    0000015 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000016 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    0000017 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000018 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    0000019 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000020 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    0000021 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000022 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    0000023 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000024 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    #25 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000026 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    0000027 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000028 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    0000029 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4

Direct leak of 4 byte(s) in 1 object(s) allocated from:
    #0 0x5df618 in realloc /var/tmp/paludis/build/dev-libs-compiler-rt-3.9.0/work/compiler-rt-3.9.0.src/lib/asan/asan_malloc_linux.cc:77
    0000001 0x2b5773984bf7 in xrealloc /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/adt/xmalloc.c:36:20
    0000002 0x2b5773a1dcfb in co_collect_units /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/be/becopyopt.c:407:17
    0000003 0x2b5773a3fc3a in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:39:2
    0000004 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000005 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000006 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000007 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000008 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000009 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000010 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    #11 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000012 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    #13 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000014 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    0000015 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000016 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    0000017 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000018 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    0000019 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000020 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    0000021 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000022 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    0000023 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000024 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    #25 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000026 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    0000027 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4
    0000028 0x2b5773a3fc7c in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:44:4
    0000029 0x2b5773a3fd2b in irg_walk_2_pre /home/moben/Hacking/Uni/compilerpraktikum/libfirm/ir/ir/irgwalk.c:48:4

SUMMARY: AddressSanitizer: 12 byte(s) leaked in 2 allocation(s).
? file icon main-00.vcg [^] (20,741 bytes) 2016-12-07 12:35
? file icon libfirm_leak.java [^] (237 bytes) 2016-12-07 15:17
? file icon firm-leak.patch [^] (893 bytes) 2017-01-10 10:22
? file icon firm-leak_v2.patch [^] (934 bytes) 2017-01-10 10:28
Issue History
2016-12-07 12:35 moben New Issue
2016-12-07 12:35 moben File Added: main-00.vcg
2016-12-07 12:37 moben Note Added: 0000281
2016-12-07 15:17 moben File Added: libfirm_leak.java
2017-01-10 10:22 moben File Added: firm-leak.patch
2017-01-10 10:27 moben Note Added: 0000282
2017-01-10 10:28 moben File Added: firm-leak_v2.patch
2017-01-10 10:28 moben Note Added: 0000283
2017-01-11 12:35 mohr Note Added: 0000285
2017-01-11 12:36 mohr Note Added: 0000286
2017-01-11 12:36 mohr Status new => resolved
2017-01-11 12:36 mohr Resolution open => fixed
2017-01-11 12:36 mohr Assigned To => mohr

Notes
(0000281)
moben   
2016-12-07 12:37   
Can also be reproduced with our compiler for the Compilerpraktikum (https://github.com/morrisfeist/kit-compilerpraktikum/), [^] called with " --firm-graph --compile-firm" and the attached MiniJava file.
(0000282)
moben   
2017-01-10 10:27   
Attached a patch that fixes the issue for me.
Not sure if it is correct though.

What happens is that sometimes node_count == 1 in the Phi case, so realloc allocates memory.

But later the branch checks for node_count > 1 and frees the unit but not the contents. Maybe this should check >= 1 instead?
(0000283)
moben   
2017-01-10 10:28   
added _v2 patch, can't delete the old one for some reason.
(0000285)
mohr   
2017-01-11 12:35   
Thanks for the report. I pushed a slightly adapted patch, fixed as of 380188c48f075ce0e3c0a18a7ec757d3e9f4cb8e.
(0000286)
mohr   
2017-01-11 12:36   
Fixed in 380188c48f075ce0e3c0a18a7ec757d3e9f4cb8e.