[cairo] memory leaks

Uli Schlachter psychon at znc.in
Wed Jan 26 15:55:28 UTC 2022


Hi,

Am 25.01.22 um 09:52 schrieb Eric Feillant:
> Here's the small code:
> 
>         cairo_t *cr = render_context;
>         cairo_surface_t *surface;
>         surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
> OVERLAY_WIDTH, OVERLAY_HEIGHT);
>         render_context = cairo_create(surface);
> 
>         cairo_set_source (cr, couleur);
>         cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
>         cairo_paint(cr);
> 
>         cairo_select_font_face(cr, "monospace",
> CAIRO_FONT_SLANT_NORMAL,CAIRO_FONT_WEIGHT_BOLD);
>         cairo_set_font_size(cr, 12.0);
>         cairo_set_source_rgb(cr, 1.0, 1.0, 0.9);
> 
>         cairo_set_line_width(cr, 0.2);
>         cairo_move_to (cr, 8,25);
>         cairo_line_to (cr, 266,25);
>         cairo_stroke (cr);
> 
>         cairo_move_to(cr, 8, 18);
>         cairo_show_text(cr, match.joueur[0].nom);
>         cairo_move_to(cr, 8, 40);
>         cairo_show_text(cr, match.joueur[1].nom);

I took the above code and turned it into a runnable program. See the
attached file. No leaks to be seen.

Output from valgrind with --leak-check=full --show-leak-kinds=all:

==2299== Memcheck, a memory error detector
==2299== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2299== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info
==2299== Command: ./a.out
==2299==
==2299==
==2299== HEAP SUMMARY:
==2299==     in use at exit: 12,384 bytes in 6 blocks
==2299==   total heap usage: 9,888 allocs, 9,882 frees, 3,035,416 bytes
allocated
==2299==
==2299== 2,064 bytes in 1 blocks are still reachable in loss record 1 of 6
==2299==    at 0x48445EF: calloc (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==2299==    by 0x4C0E6EF: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4C0CF3F: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4C0ED8B: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4BC7598: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x401000D: call_init.part.0 (dl-init.c:74)
==2299==    by 0x40100EF: call_init (dl-init.c:37)
==2299==    by 0x40100EF: _dl_init (dl-init.c:121)
==2299==    by 0x4001089: ??? (in /usr/lib/x86_64-linux-gnu/ld-2.33.so)
==2299==
==2299== 2,064 bytes in 1 blocks are still reachable in loss record 2 of 6
==2299==    at 0x48445EF: calloc (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==2299==    by 0x4C0E6EF: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4C0B91F: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4C0EE17: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4BC7598: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x401000D: call_init.part.0 (dl-init.c:74)
==2299==    by 0x40100EF: call_init (dl-init.c:37)
==2299==    by 0x40100EF: _dl_init (dl-init.c:121)
==2299==    by 0x4001089: ??? (in /usr/lib/x86_64-linux-gnu/ld-2.33.so)
==2299==
==2299== 2,064 bytes in 1 blocks are still reachable in loss record 3 of 6
==2299==    at 0x48445EF: calloc (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==2299==    by 0x4C0E6EF: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4C2B3DF: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4BF2E93: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4C0EDA6: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4BC7598: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x401000D: call_init.part.0 (dl-init.c:74)
==2299==    by 0x40100EF: call_init (dl-init.c:37)
==2299==    by 0x40100EF: _dl_init (dl-init.c:121)
==2299==    by 0x4001089: ??? (in /usr/lib/x86_64-linux-gnu/ld-2.33.so)
==2299==
==2299== 2,064 bytes in 1 blocks are still reachable in loss record 4 of 6
==2299==    at 0x48445EF: calloc (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==2299==    by 0x4C0E6EF: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4C4A07F: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4BF2ECF: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4C0EDA6: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4BC7598: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x401000D: call_init.part.0 (dl-init.c:74)
==2299==    by 0x40100EF: call_init (dl-init.c:37)
==2299==    by 0x40100EF: _dl_init (dl-init.c:121)
==2299==    by 0x4001089: ??? (in /usr/lib/x86_64-linux-gnu/ld-2.33.so)
==2299==
==2299== 2,064 bytes in 1 blocks are still reachable in loss record 5 of 6
==2299==    at 0x48445EF: calloc (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==2299==    by 0x4C0E6EF: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4C4A6CF: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4C0EDA6: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4BC7598: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x401000D: call_init.part.0 (dl-init.c:74)
==2299==    by 0x40100EF: call_init (dl-init.c:37)
==2299==    by 0x40100EF: _dl_init (dl-init.c:121)
==2299==    by 0x4001089: ??? (in /usr/lib/x86_64-linux-gnu/ld-2.33.so)
==2299==
==2299== 2,064 bytes in 1 blocks are still reachable in loss record 6 of 6
==2299==    at 0x48445EF: calloc (in
/usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==2299==    by 0x4C0E6EF: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4C117FF: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4C0EDC6: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x4BC7598: ??? (in
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.40.0)
==2299==    by 0x401000D: call_init.part.0 (dl-init.c:74)
==2299==    by 0x40100EF: call_init (dl-init.c:37)
==2299==    by 0x40100EF: _dl_init (dl-init.c:121)
==2299==    by 0x4001089: ??? (in /usr/lib/x86_64-linux-gnu/ld-2.33.so)
==2299==
==2299== LEAK SUMMARY:
==2299==    definitely lost: 0 bytes in 0 blocks
==2299==    indirectly lost: 0 bytes in 0 blocks
==2299==      possibly lost: 0 bytes in 0 blocks
==2299==    still reachable: 12,384 bytes in 6 blocks
==2299==         suppressed: 0 bytes in 0 blocks
==2299==
==2299== For lists of detected and suppressed errors, rerun with: -s
==2299== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

The above are not real leaks. libpixman just has some static setup that
is done once and load time. No idea how to suppress this false positive.

Anyway: There are no leaks.

The calls to cairo_debug_reset_static_data() and FcFini() are not needed
in a real program (and they are not even a good idea). They just exist
to free some static data that would otherwise show in valgrind. These
are not real leaks. This is basically the same thing as valgrind reports
for pixman, just that one can tell fontconfig and cairo to free this stuff.

Cheers,
Uli
-- 
“I’m Olaf and I like warm hugs.”
-------------- next part --------------
A non-text attachment was scrubbed...
Name: foo.c
Type: text/x-csrc
Size: 1127 bytes
Desc: not available
URL: <https://lists.cairographics.org/archives/cairo/attachments/20220126/e092c258/attachment.c>


More information about the cairo mailing list