leaks in clang (many!)

Hi,

TL;DR: there are tons of leaks in Clang, please help us fix them.

We have a build bot that runs clang bootstrap under AddressSanitizer (ASan).
LeakSanitizer (LSan, a leak detector that runs as part of ASan) is enabled on that bot,

but as we’ve learned today only on part of the bootstrap actually runs LSan.
LSan is enabled by the env. var ASAN_OPTIONS=detect_leaks=1 and we have

this env. var. set on the bot so the 3-rd stage build uses it.
However the lit runner clears the environment and the lit
tests were not running under lsan until today, when I tried to enable lsan by default.

This has discovered tons of leaks and I reverted the change.
The leaks happen in various modes that are not exercised during regular self-compilation on linux,
e.g. static analyzer, -emit-llvm, Windows ABI, etc.
I’ve filed a few bugs (19520 19522 19523 19524) but there are dozens more reports left.

If you care about leaks in clang, please check http://llvm.org/bugs/attachment.cgi?id=12423
and see if any of these leaks are in your code.

Thanks,

–kcc

Manuel mentions that clang has some intentional leaks.

That’s right, and we handle them using BuryPointer (./lib/Frontend/CompilerInvocation.cpp).
So if there are more intentional leaks we need to bury them too to let LSan find the interesting ones.

–kcc

Do you have a bot that provides an up-to-date list of these reports? r207031 probably fixes many of the convertCommentToXML stacks.

Do you have a bot that provides an up-to-date list of these reports?

No bot, but I've just updated
http://llvm.org/bugs/show_bug.cgi?id=19521with the new log.
The leak from http://llvm.org/bugs/show_bug.cgi?id=19520 appears over 1000
times while running check-clang,
so I suppressed it, all other leaks are in the log:
http://llvm.org/bugs/attachment.cgi?id=12428
Quite a few still.

There are also 14 leaks while running check-llvm, added a separate log:
http://llvm.org/bugs/attachment.cgi?id=12429

r207031 probably fixes many of the convertCommentToXML stacks.

Thanks for this and all the other fixes!

--kcc

Do you have a bot that provides an up-to-date list of these reports?

No bot, but I've just updated http://llvm.org/bugs/show_bug.cgi?id=19521with the new log.
The leak from http://llvm.org/bugs/show_bug.cgi?id=19520 appears over
1000 times while running check-clang,
so I suppressed it, all other leaks are in the log:
http://llvm.org/bugs/attachment.cgi?id=12428
Quite a few still.

Down from 4200 to 1500 (or 2500, if you don't count the 1000 suppressed),
that's good progress :slight_smile:

Many of these are in CGDebugInfo and some in CodeGenFunction – if someone
who knows that code could look at these (it's probably just 2-4 bugs),
that'd be a huge help.

Do you have a bot that provides an up-to-date list of these reports?

No bot, but I've just updated http://llvm.org/bugs/show_bug.cgi?id=19521
with the new log.
The leak from http://llvm.org/bugs/show_bug.cgi?id=19520 appears over 1000
times while running check-clang,
so I suppressed it, all other leaks are in the log:
http://llvm.org/bugs/attachment.cgi?id=12428
Quite a few still.

Down from 4200 to 1500 (or 2500, if you don't count the 1000 suppressed),
that's good progress :slight_smile:

Many of these are in CGDebugInfo

Could you point me to the bugs/stack traces/repro steps for CGDebugInfo leaks?

>>
>>
>>
>>
>>>
>>> Do you have a bot that provides an up-to-date list of these reports?
>>
>>
>> No bot, but I've just updated
http://llvm.org/bugs/show_bug.cgi?id=19521
>> with the new log.
>> The leak from http://llvm.org/bugs/show_bug.cgi?id=19520 appears over
1000
>> times while running check-clang,
>> so I suppressed it, all other leaks are in the log:
>> http://llvm.org/bugs/attachment.cgi?id=12428
>> Quite a few still.
>
>
> Down from 4200 to 1500 (or 2500, if you don't count the 1000 suppressed),
> that's good progress :slight_smile:
>
> Many of these are in CGDebugInfo

Could you point me to the bugs/stack traces/repro steps for CGDebugInfo
leaks?

Extract and open the file Kostya attached, look for "leak of". About the
first 40% are in CGDebugInfo. (Search for "CGDebugInfo::" for example).
You're looking for stacks like

Direct leak of 536 byte(s) in 1 object(s) allocated from:
    #0 0x7ba998 in __interceptor_malloc
/home/kcc/llvm/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:75
    #1 0x1e8f933 in llvm::MDNode::getTemporary(llvm::LLVMContext&,
llvm::ArrayRef<llvm::Value*>) /home/kcc/llvm/lib/IR/Metadata.cpp:285
    #2 0x6332104 in llvm::DIBuilder::createForwardDecl(unsigned int,
llvm::StringRef, llvm::DIDescriptor, llvm::DIFile, unsigned int, unsigned
int, unsigned long, unsigned long, llvm::StringRef)
/home/kcc/llvm/lib/IR/DIBuilder.cpp:905
    #3 0x36027a9 in
clang::CodeGen::CGDebugInfo::getOrCreateRecordFwdDecl(clang::RecordType
const*, llvm::DIDescriptor)
/home/kcc/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp:626
    #4 0x361b4c1 in
clang::CodeGen::CGDebugInfo::CreateLimitedType(clang::RecordType const*)
/home/kcc/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp:2305
    #5 0x36113a8 in
clang::CodeGen::CGDebugInfo::getOrCreateLimitedType(clang::RecordType
const*, llvm::DIFile)
/home/kcc/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp:2260
    #6 0x360fb99 in
clang::CodeGen::CGDebugInfo::CreateTypeDefinition(clang::RecordType const*)
/home/kcc/llvm/tools/clang/lib/CodeGen/CGDebugInfo.cpp:1537