読者です 読者をやめる 読者になる 読者になる

ちぎっては投げるブログ

Programming, Android, RaspberryPi, Digital Devices, Kinkuma Hamster...

glistを使うとvalgrindでリークと判定されてしまう

TIL Programming C/C++

stackoverflow.com

GLibとは?

もともとはGUIツールキットであるGTK+のユーティリティライブラリであったが、GTKに限らず使うことが出来る。 C言語は、最近の便利な言語に慣れきってしまうと不便なことこのうえないが、GLibは文字列操作やメモリ確保、連結リストや分木構造などを提供してくれる。

GListとは?

GLibの提供する双方向リストである。使い方はたとえば以下のリポジトリのような感じで、appendやinsertが出来る。

generic_list/test.c at master · beng94/generic_list · GitHub

提供される関数は以下である。

Doubly-Linked Lists: GLib Reference Manual

valgrindとは?

Linux上で動くメモリリークチェックツールである。

freeされていない領域が残っていないかや、バッファオーバーランしていないか、freeした領域に触っていないか、など、メモリ周りの確認が出来る。

$ valgrind --leak-check=full ./a.out

GListを使ったプログラムでvalgrindをかけるとリークと言われる

たとえば、

=29997== 1,512 bytes in 3 blocks are possibly lost in loss record 24 of 25
==29997==    at 0x4004B11: memalign (vg_replace_malloc.c:532)
==29997==    by 0x4004B6B: posix_memalign (vg_replace_malloc.c:660)
==29997==    by 0x5E9AC4: ??? (in /lib/libglib-2.0.so.0.1200.3)
==29997==    by 0x5EA4FE: g_slice_alloc (in /lib/libglib-2.0.so.0.1200.3)

c - Valgrind reports memory 'possibly lost' when using glib data types - Stack Overflow

のような感じだ。

メモリの最適化を止める

どうやら、Glistはそのままだと勝手に良い感じにメモリを確保しており、g_list_free ()やg_list_free_full ()を正しく行っても、valgrind的にはメモリリークしていると判断するようである。 実際には問題がないはずなので、valgrindでメッセージが出ないように抑制したい。

そのためには、G_SLICE=always-malloc G_DEBUG=gc-friendly を実行時につける。

# 通常
valgrind --leak-check=full ./hoge.exe
# 最適化の抑制
G_SLICE=always-malloc G_DEBUG=gc-friendly  valgrind --leak-check=full ./hoge.exe

Valgrind - GNOME Wiki!

これで、不要な警告は出なくなる。