You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Description
When declaring a payload struct with PAQs, memory leaks if one of the PAQ clauses specifies more than four shader stages.
This is because the hlsl::PayloadAccessAnnotation keeps those stages in a llvm::SmallVector<hlsl::DXIL::PayloadAccessShaderStage, 4u> field, which starts allocating memory in this case. Since UnusualAnnotation has no virtual deconstructor this memory is never free'd.
Steps to Reproduce
Create a dxc Release build on Linux with Clang 18 + Asan enabled (asan only reported the leak in this specific configuration).
Create an hlsl file with a payload struct. One of the payload fields needs to have more than four shader stages, eg:
Actual Behavior
This was observed in a CI run for #7097 (commit cb13203). The test case in this PR has since been fixed to only specify four stages to workaround this issue.
******************** TEST 'Clang :: SemaHLSL/hlsl/objects/HitObject/hitobject-entry-errors.hlsl' FAILED ********************
Script:
--
/home/vsts/work/1/s/build/./bin/dxc -T lib_6_9 /home/vsts/work/1/s/tools/clang/test/SemaHLSL/hlsl/objects/HitObject/hitobject-entry-errors.hlsl -verify
--
Exit Code: 1
Command Output (stderr):
--
=================================================================
==18293==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 72 byte(s) in 2 object(s) allocated from:
#0 0x55a3223affbd in operator new[](unsigned long) (/home/vsts/work/1/s/build/bin/dxc-3.7+0x203fbd) (BuildId: 34f0a07c804d72cd)
#1 0x7f129b11d3b6 in llvm::SmallVectorBase::grow_pod(void*, unsigned long, unsigned long) /home/vsts/work/1/s/lib/Support/SmallVector.cpp:27:19
#2 0x7f129ce097f5 in grow_pod /home/vsts/work/1/s/include/llvm/ADT/SmallVector.h:81:22
#3 0x7f129ce097f5 in grow /home/vsts/work/1/s/include/llvm/ADT/SmallVector.h:327:11
#4 0x7f129ce097f5 in llvm::SmallVectorImpl<hlsl::DXIL::PayloadAccessShaderStage>::operator=(llvm::SmallVectorImpl<hlsl::DXIL::PayloadAccessShaderStage> const&) /home/vsts/work/1/s/include/llvm/ADT/SmallVector.h:763:11
#5 0x7f129cdd88d2 in SmallVector /home/vsts/work/1/s/include/llvm/ADT/SmallVector.h:894:27
#6 0x7f129cdd88d2 in PayloadAccessAnnotation /home/vsts/work/1/s/tools/clang/include/clang/AST/HlslTypes.h:282:8
#7 0x7f129cdd88d2 in clang::Parser::MaybeParseHLSLAttributes(std::__1::vector<hlsl::UnusualAnnotation*, std::__1::allocator<hlsl::UnusualAnnotation*>>&) /home/vsts/work/1/s/tools/clang/lib/Parse/ParseDecl.cpp:418:38
#8 0x7f129cdff895 in MaybeParseHLSLAttributes /home/vsts/work/1/s/tools/clang/include/clang/Parse/Parser.h:2102:12
#9 0x7f129cdff895 in clang::Parser::ParseDirectDeclarator(clang::Declarator&) /home/vsts/work/1/s/tools/clang/lib/Parse/ParseDecl.cpp:6315:9
#10 0x7f129cdfcfe9 in clang::Parser::ParseDeclaratorInternal(clang::Declarator&, void (clang::Parser::*)(clang::Declarator&)) /home/vsts/work/1/s/tools/clang/lib/Parse/ParseDecl.cpp:5903:7
#11 0x7f129ce20015 in clang::Parser::ParseCXXMemberDeclaratorBeforeInitializer(clang::Declarator&, clang::VirtSpecifiers&, clang::ActionResult<clang::Expr*, true>&, clang::Parser::LateParsedAttrList&) /home/vsts/work/1/s/tools/clang/lib/Parse/ParseDeclCXX.cpp:2107:5
#12 0x7f129ce236cc in clang::Parser::ParseCXXClassMemberDeclaration(clang::AccessSpecifier, clang::AttributeList*, clang::Parser::ParsedTemplateInfo const&, clang::ParsingDeclRAIIObject*) /home/vsts/work/1/s/tools/clang/lib/Parse/ParseDeclCXX.cpp:2489:7
#13 0x7f129ce1cf24 in clang::Parser::ParseCXXMemberSpecification(clang::SourceLocation, clang::SourceLocation, clang::Parser::ParsedAttributesWithRange&, unsigned int, clang::Decl*) /home/vsts/work/1/s/tools/clang/lib/Parse/ParseDeclCXX.cpp:3153:7
#14 0x7f129ce18816 in clang::Parser::ParseClassSpecifier(clang::tok::TokenKind, clang::SourceLocation, clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, bool, clang::Parser::DeclSpecContext, clang::Parser::ParsedAttributesWithRange&) /home/vsts/work/1/s/tools/clang/lib/Parse/ParseDeclCXX.cpp:1786:7
#15 0x7f129cde4876 in clang::Parser::ParseDeclarationSpecifiers(clang::DeclSpec&, clang::Parser::ParsedTemplateInfo const&, clang::AccessSpecifier, clang::Parser::DeclSpecContext, clang::Parser::LateParsedAttrList*) /home/vsts/work/1/s/tools/clang/lib/Parse/ParseDecl.cpp:4151:7
#16 0x7f129cd88700 in clang::Parser::ParseDeclOrFunctionDefInternal(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec&, clang::AccessSpecifier) /home/vsts/work/1/s/tools/clang/lib/Parse/Parser.cpp:908:3
#17 0x7f129cd882d7 in clang::Parser::ParseDeclarationOrFunctionDefinition(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*, clang::AccessSpecifier) /home/vsts/work/1/s/tools/clang/lib/Parse/Parser.cpp:981:12
#18 0x7f129cd87368 in clang::Parser::ParseExternalDeclaration(clang::Parser::ParsedAttributesWithRange&, clang::ParsingDeclSpec*) /home/vsts/work/1/s/tools/clang/lib/Parse/Parser.cpp:839:12
#19 0x7f129cd86cf7 in clang::Parser::ParseTopLevelDecl(clang::OpaquePtr<clang::DeclGroupRef>&) /home/vsts/work/1/s/tools/clang/lib/Parse/Parser.cpp:606:12
#20 0x7f129cce8da7 in clang::ParseAST(clang::Sema&, bool, bool) /home/vsts/work/1/s/tools/clang/lib/Parse/ParseAST.cpp:140:11
#21 0x7f129b75b50d in clang::FrontendAction::Execute() /home/vsts/work/1/s/tools/clang/lib/Frontend/FrontendAction.cpp:455:8
#22 0x7f129a1b9959 in DxcCompiler::Compile(DxcBuffer const*, wchar_t const**, unsigned int, IDxcIncludeHandler*, _GUID const&, void**) /home/vsts/work/1/s/tools/clang/tools/dxcompiler/dxcompilerobj.cpp:933:18
#23 0x7f129a1b005c in hlsl::DxcCompilerAdapter::WrapCompile(bool, IDxcBlob*, wchar_t const*, wchar_t const*, wchar_t const*, wchar_t const**, unsigned int, DxcDefine const*, unsigned int, IDxcIncludeHandler*, IDxcOperationResult**, wchar_t**, IDxcBlob**) /home/vsts/work/1/s/tools/clang/tools/dxcompiler/dxcompilerobj.cpp:1855:5
#24 0x7f129a1b2e2c in hlsl::DxcCompilerAdapter::CompileWithDebug(IDxcBlob*, wchar_t const*, wchar_t const*, wchar_t const*, wchar_t const**, unsigned int, DxcDefine const*, unsigned int, IDxcIncludeHandler*, IDxcOperationResult**, wchar_t**, IDxcBlob**) /home/vsts/work/1/s/tools/clang/tools/dxcompiler/dxcompilerobj.cpp:1758:10
#25 0x7f129a1b47c8 in hlsl::DxcCompilerAdapter::Compile(IDxcBlob*, wchar_t const*, wchar_t const*, wchar_t const*, wchar_t const**, unsigned int, DxcDefine const*, unsigned int, IDxcIncludeHandler*, IDxcOperationResult**) /home/vsts/work/1/s/tools/clang/tools/dxcompiler/dxcompileradapter.h:75:12
#26 0x55a3223c0d06 in DxcContext::Compile() /home/vsts/work/1/s/tools/clang/tools/dxclib/dxc.cpp:874:9
#27 0x55a3223c9fd4 in dxc::main(int, char const**) /home/vsts/work/1/s/tools/clang/tools/dxclib/dxc.cpp:1502:24
#28 0x7f1298629d8f (/lib/x86_64-linux-gnu/libc.so.6+0x29d8f) (BuildId: 490fef8403240c91833978d494d39e537409b92e)
SUMMARY: AddressSanitizer: 72 byte(s) leaked in 2 allocation(s).
Environment
Observed with
DXC top of tree
Azure CI Clang /Release/linux pipeline. Reproduced locally using Ubuntu on WSL / Clang 18.1.3 / Release build with cmake -DLLVM_USE_SANITIZER=Address
The text was updated successfully, but these errors were encountered:
Description
When declaring a payload struct with PAQs, memory leaks if one of the PAQ clauses specifies more than four shader stages.
This is because the
hlsl::PayloadAccessAnnotation
keeps those stages in allvm::SmallVector<hlsl::DXIL::PayloadAccessShaderStage, 4u>
field, which starts allocating memory in this case. SinceUnusualAnnotation
has no virtual deconstructor this memory is never free'd.Steps to Reproduce
Actual Behavior
This was observed in a CI run for #7097 (commit cb13203). The test case in this PR has since been fixed to only specify four stages to workaround this issue.
Environment
Observed with
cmake -DLLVM_USE_SANITIZER=Address
The text was updated successfully, but these errors were encountered: