私は大規模なC++プロジェクトに取り組んでおり、それをclangでコンパイルするのは苦痛なので、GCCで立ち往生しています。
ニースを使いたい-fsanitize=leak
前のジョブでclangですでに使用したフラグですが、機能していないようです。
私はそれをテストするために非常に簡単な例を作りました:
#include <stdlib.h>
void FooBar() {
malloc(7);
}
int main() {
FooBar();
return 0;
}
Clangを使用すると、期待どおりに機能します。
>> clang -fsanitize=leak main.cpp
>> LSAN_OPTIONS=detect_leaks=1 ./a.out
=================================================================
==18052==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 7 byte(s) in 1 object(s) allocated from:
#0 0x41dcbc (~/dev/addresssanitizertest/a.out+0x41dcbc)
#1 0x431ac3 (~/dev/addresssanitizertest/a.out+0x431ac3)
#2 0x431ae3 (~/dev/addresssanitizertest/a.out+0x431ae3)
#3 0x7f8077e71a3f (/lib/x86_64-linux-gnu/libc.so.6+0x20a3f)
SUMMARY: LeakSanitizer: 7 byte(s) leaked in 1 allocation(s).
>>
しかし、gccでは何も検出されないようです。
>> gcc -fsanitize=leak main.cpp
>> LSAN_OPTIONS=detect_leaks=1 ./a.out
>>
ニース環境変数のようなものを見逃しましたか?誰かがgccで動作させたことがありますか?
[〜#〜] edit [〜#〜]:これは次のように機能します:
g++ -fsanitize=address main.cpp
ASAN_OPTIONS=detect_leaks=1 ./a.out
しかし、それはできません。パフォーマンスの欠点が多すぎます。リーク検出のみが必要です。
Gcc 5.1で解決しました(4.9を使用していました)。
編集:5.2も機能しないようです編集2:ubuntu 15.10(5.2.1)で提供されるgccでは機能しませんが、ソースから5.2.0を再コンパイルし、正常に機能しました。私には本当に手がかりがありません。
これを読んでパッチを使用する必要があります:
私は同じ問題を抱えていました(Ubuntu15.04とgcc4.9.2で)。
ldd
を使用してliblsan.so
はリンクされていなかったので、ここでどのように修正しましたか:
1)コンパイル中に強制的にリンクする
>> gcc -fsanitize=leak main.cpp -llsan
2)で実行する
./a.out