Issue 153551
Summary [clang] memory leak with late parsed attributes and -skip-function-bodies
Labels clang:frontend
Assignees
Reporter mizvekov
    This can be observed using a clang built with Address sanitizer (LLVM_USE_SANITIZER=Address).

For this example:
```C++
void f() __attribute__((__diagnose_if__(false, "hello", "warning"))) {}
```

Running `clang -cc1 -skip-function-bodies test.cc` gives:
```
==194977==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 184 byte(s) in 1 object(s) allocated from:
    #0 0xaaaad5046c60 in operator new(unsigned long) (build/dbg/bin/clang-20+0xd3a6c60) (BuildId: 6fd25c8c9a809e25ffe2ddb309ec5769179c642e)
    #1 0xaaaadf13e234 in clang::Parser::ParseSingleGNUAttribute(clang::ParsedAttributes&, clang::SourceLocation&, clang::Parser::LateParsedAttrList*, clang::Declarator*) clang/lib/Parse/ParseDecl.cpp:206:7
    #2 0xaaaadf13f9f0 in clang::Parser::ParseGNUAttributes(clang::ParsedAttributes&, clang::Parser::LateParsedAttrList*, clang::Declarator*) clang/lib/Parse/ParseDecl.cpp:307:11
    #3 0xaaaadf078368 in clang::Parser::MaybeParseGNUAttributes(clang::Declarator&, clang::Parser::LateParsedAttrList*) clang/include/clang/Parse/Parser.h:2937:7
    #4 0xaaaadf1595ec in clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::ParsedAttributes&, clang::Parser::ParsedTemplateInfo&, clang::SourceLocation*, clang::Parser::ForRangeInit*) clang/lib/Parse/ParseDecl.cpp:2365:5
    #5 0xaaaadf068528 in clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec&, clang::AccessSpecifier) clang/lib/Parse/Parser.cpp:1244:10
    #6 0xaaaadf0674a0 in clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*, clang::AccessSpecifier) clang/lib/Parse/Parser.cpp:1266:12
    #7 0xaaaadf064dcc in clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) clang/lib/Parse/Parser.cpp:1069:14
    #8 0xaaaadf0610a8 in clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) clang/lib/Parse/Parser.cpp:758:12
    #9 0xaaaadf060080 in clang::Parser::ParseFirstTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) clang/lib/Parse/Parser.cpp:608:26
    #10 0xaaaadf054374 in clang::ParseAST(clang::Sema&, bool, bool) clang/lib/Parse/ParseAST.cpp:170:25
    #11 0xaaaadbe9dc98 in clang::FrontendAction::Execute() clang/lib/Frontend/FrontendAction.cpp:1077:8
    #12 0xaaaadbd774b0 in clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) clang/lib/Frontend/CompilerInstance.cpp:1062:33
    #13 0xaaaadc0c5e68 in clang::ExecuteCompilerInvocation(clang::CompilerInstance*) clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:296:25
    #14 0xaaaad50531d0 in cc1_main(llvm::ArrayRef<char const*>, char const*, void*) clang/tools/driver/cc1_main.cpp:286:15
    #15 0xaaaad504bb74 in ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) clang/tools/driver/driver.cpp:218:12
    #16 0xaaaad5049fb0 in clang_main(int, char**, llvm::ToolContext const&) clang/tools/driver/driver.cpp:259:12
    #17 0xaaaad506ad30 in main build/dbg/tools/clang/tools/driver/clang-driver.cpp:17:10
    #18 0xffff9b812298  (/lib/aarch64-linux-gnu/libc.so.6+0x22298) (BuildId: b32c35038e644c70c27979cb0b90182f43f6794b)
    #19 0xffff9b812378 in __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x22378) (BuildId: b32c35038e644c70c27979cb0b90182f43f6794b)
    #20 0xaaaad4f6012c in _start (build/dbg/bin/clang-20+0xd2c012c) (BuildId: 6fd25c8c9a809e25ffe2ddb309ec5769179c642e)

Indirect leak of 216 byte(s) in 1 object(s) allocated from:
    #0 0xaaaad5004220 in malloc (build/dbg/bin/clang-20+0xd364220) (BuildId: 6fd25c8c9a809e25ffe2ddb309ec5769179c642e)
    #1 0xaaaada4b27c0 in llvm::safe_malloc(unsigned long) llvm/include/llvm/Support/MemAlloc.h:26:18
 #2 0xaaaada4b27c0 in llvm::SmallVectorBase<unsigned int>::grow_pod(void*, unsigned long, unsigned long) llvm/lib/Support/SmallVector.cpp:151:15
    #3 0xaaaadf25794c in llvm::SmallVectorTemplateCommon<clang::Token, void>::grow_pod(unsigned long, unsigned long) llvm/include/llvm/ADT/SmallVector.h:138:11
    #4 0xaaaadf25794c in llvm::SmallVectorTemplateBase<clang::Token, true>::grow(unsigned long) llvm/include/llvm/ADT/SmallVector.h:525:41
    #5 0xaaaadf25794c in clang::Token const* llvm::SmallVectorTemplateCommon<clang::Token, void>::reserveForParamAndGetAddressImpl<llvm::SmallVectorTemplateBase<clang::Token, true>>(llvm::SmallVectorTemplateBase<clang::Token, true>*, clang::Token const&, unsigned long) llvm/include/llvm/ADT/SmallVector.h:243:11
    #6 0xaaaadf25794c in llvm::SmallVectorTemplateBase<clang::Token, true>::reserveForParamAndGetAddress(clang::Token const&, unsigned long) llvm/include/llvm/ADT/SmallVector.h:530:12
    #7 0xaaaadf25794c in llvm::SmallVectorTemplateBase<clang::Token, true>::push_back(clang::Token const&) llvm/include/llvm/ADT/SmallVector.h:562:23
    #8 0xaaaadf25794c in clang::Parser::ConsumeAndStoreUntil(clang::tok::TokenKind, clang::tok::TokenKind, llvm::SmallVector<clang::Token, 4u>&, bool, bool) clang/lib/Parse/ParseCXXInlineMethods.cpp:958:12
    #9 0xaaaadf13e66c in clang::Parser::ConsumeAndStoreUntil(clang::tok::TokenKind, llvm::SmallVector<clang::Token, 4u>&, bool, bool) clang/include/clang/Parse/Parser.h:1678:12
    #10 0xaaaadf13e66c in clang::Parser::ParseSingleGNUAttribute(clang::ParsedAttributes&, clang::SourceLocation&, clang::Parser::LateParsedAttrList*, clang::Declarator*) clang/lib/Parse/ParseDecl.cpp:219:3
    #11 0xaaaadf13f9f0 in clang::Parser::ParseGNUAttributes(clang::ParsedAttributes&, clang::Parser::LateParsedAttrList*, clang::Declarator*) clang/lib/Parse/ParseDecl.cpp:307:11
    #12 0xaaaadf078368 in clang::Parser::MaybeParseGNUAttributes(clang::Declarator&, clang::Parser::LateParsedAttrList*) clang/include/clang/Parse/Parser.h:2937:7
    #13 0xaaaadf1595ec in clang::Parser::ParseDeclGroup(clang::ParsingDeclSpec&, clang::DeclaratorContext, clang::ParsedAttributes&, clang::Parser::ParsedTemplateInfo&, clang::SourceLocation*, clang::Parser::ForRangeInit*) clang/lib/Parse/ParseDecl.cpp:2365:5
    #14 0xaaaadf068528 in clang::Parser::ParseDeclOrFunctionDefInternal(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec&, clang::AccessSpecifier) clang/lib/Parse/Parser.cpp:1244:10
    #15 0xaaaadf0674a0 in clang::Parser::ParseDeclarationOrFunctionDefinition(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*, clang::AccessSpecifier) clang/lib/Parse/Parser.cpp:1266:12
    #16 0xaaaadf064dcc in clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&, clang::ParsedAttributes&, clang::ParsingDeclSpec*) clang/lib/Parse/Parser.cpp:1069:14
    #17 0xaaaadf0610a8 in clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) clang/lib/Parse/Parser.cpp:758:12
    #18 0xaaaadf060080 in clang::Parser::ParseFirstTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&, clang::Sema::ModuleImportState&) clang/lib/Parse/Parser.cpp:608:26
    #19 0xaaaadf054374 in clang::ParseAST(clang::Sema&, bool, bool) clang/lib/Parse/ParseAST.cpp:170:25
    #20 0xaaaadbe9dc98 in clang::FrontendAction::Execute() clang/lib/Frontend/FrontendAction.cpp:1077:8
    #21 0xaaaadbd774b0 in clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) clang/lib/Frontend/CompilerInstance.cpp:1062:33
    #22 0xaaaadc0c5e68 in clang::ExecuteCompilerInvocation(clang::CompilerInstance*) clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:296:25
    #23 0xaaaad50531d0 in cc1_main(llvm::ArrayRef<char const*>, char const*, void*) clang/tools/driver/cc1_main.cpp:286:15
    #24 0xaaaad504bb74 in ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) clang/tools/driver/driver.cpp:218:12
    #25 0xaaaad5049fb0 in clang_main(int, char**, llvm::ToolContext const&) clang/tools/driver/driver.cpp:259:12
    #26 0xaaaad506ad30 in main build/dbg/tools/clang/tools/driver/clang-driver.cpp:17:10
    #27 0xffff9b812298  (/lib/aarch64-linux-gnu/libc.so.6+0x22298) (BuildId: b32c35038e644c70c27979cb0b90182f43f6794b)
    #28 0xffff9b812378 in __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x22378) (BuildId: b32c35038e644c70c27979cb0b90182f43f6794b)
    #29 0xaaaad4f6012c in _start (build/dbg/bin/clang-20+0xd2c012c) (BuildId: 6fd25c8c9a809e25ffe2ddb309ec5769179c642e)

SUMMARY: AddressSanitizer: 400 byte(s) leaked in 2 allocation(s).
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to