Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

メモリ・リーク検出機能の追加とリーク発見 #40

Closed
yossi-tahara opened this issue Jul 28, 2017 · 3 comments
Closed

メモリ・リーク検出機能の追加とリーク発見 #40

yossi-tahara opened this issue Jul 28, 2017 · 3 comments

Comments

@yossi-tahara
Copy link
Owner

メモリ・リーク検出をmsvc向けに導入していたのですが、事情によりオープンβ開始時に一旦削除していました。それを回復したところ、特殊なケースですがリークが見つかりました。

オーナーポインタp, qがシリアライズ時に同じインスタンスを指していたとします。
そのデータをデシリアライズする際に、オーナーポインタpとqが異なるインスタンスを指していた場合にqが指していたインスタンスの解放漏れが見つかりました。
この不具合は早期に修正します。

またgcc用にもリーク検出を追加する予定です。

@yossi-tahara
Copy link
Owner Author

思っていたより時間がかかっており、中間報告です。

1.msvc

検出したリークは解決できました。ただし、デバッグ・モードでのみ検出なので少し心配なため、リリース・ビルドでも検出できるgccでの検出を進めています。

2.gcc

2-1.mtrace

mtraceでトライしていたのですがうまくいきません。

staticなローカル変数を各所で使っており、mtrace後にコンストラクトされたstaticローカル変数のデストラクタが呼ばれた後にmuntrace()する必要があります。
コンストラクタでmtrace()し、デストラクタでmuntrace()するクラスを作り、attribute((init_priority(n)))を使って最初にこれをコンストラクトすることで、最後にデストラクトされる筈なのですが、リーク検出が発生します。
mtraceを外しただけの同じプログラムでvalgrindではリークは検出されないため、muntrace()制御がうまくいかないと判断し、断念しました。

2-2.valgrind

組み込みできました。リークは検出されません。
しかし、long doubleの使われていないエリアの未初期化検出などが見つかり、対処を進めています。

3.mingw

ほぼ同じソースですので、メモリ・リークしない筈ですが、可能であれば検出テストを導入したいです。しかし、リーク検出する機構を見つけることができていません。
もし、mingw用のリーク検出をご存知の方がいらっしゃいましたら、是非教えてください。

@yossi-tahara
Copy link
Owner Author

yossi-tahara commented Aug 18, 2017

gccバージョンでメモリ・リーク顕在化

msvcはデバッグ・ビルドしかリーク検出できません。reference_and_testの配下のテストは非常に思いため、デバッグ・ビルドしていないため顕在化しませんでしたが、valgrindでテストすることで顕在化しました。

reference_and_test/basic2にてtutoriseObjectTracking()で2箇所、tutorisePolymorphism()で4箇所発生します。
単純にテスト・ルーチンのバグでした。tutoriseObjectTracking()については、テスト用に作成したAutoReleaseクラスにて自動解放するつもりだったのですが、AutoReleaseへポインタを直接与えたため、AutoRelease生成後にポインタを変更した時に変更先が解放されずリークしていました。
ポインタではなくポインタへの参照を登録することで対処できました。

tutorisePolymorphism()については、思いっきり解放忘れです。newの後、解放していませんでした。
AutoReleaseで解放することで対処できました。

travis-ciでvalgrind周りでエラー

travis-ciにはvalgrindが入っていません。しかし、valgrindの有無判定ロジックが無いことを検出するのに失敗し、valgrindを起動しエラーになっていました。
whereisで探していたためライブラリにマッチしてしまい、ご判定してました。(whereisの機能をPath内をサーチするものと勘違いしてました。)
whichで探すようにして対処できました。

@yossi-tahara
Copy link
Owner Author

v1.1.3としてリリースしたのでクローズします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant