web-dev-qa-db-ja.com

GCCおよび-fsanitize = Leak

私は大規模な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

しかし、それはできません。パフォーマンスの欠点が多すぎます。リーク検出のみが必要です。

7
Jeremad

Gcc 5.1で解決しました(4.9を使用していました)。

編集:5.2も機能しないようです編集2:ubuntu 15.10(5.2.1)で提供されるgccでは機能しませんが、ソースから5.2.0を再コンパイルし、正常に機能しました。私には本当に手がかりがありません。

1
Jeremad

これを読んでパッチを使用する必要があります:

https://gcc.gnu.org/ml/gcc-patches/2013-11/msg01874.html

2
eroween

私は同じ問題を抱えていました(Ubuntu15.04とgcc4.9.2で)。

lddを使用してliblsan.soはリンクされていなかったので、ここでどのように修正しましたか:

1)コンパイル中に強制的にリンクする

>> gcc -fsanitize=leak main.cpp -llsan

2)で実行する

./a.out

0
CastleDefender