In ClangASTContext::CreateFunctionTemplateSpecializationInfo a TemplateArgumentList is allocated on the stack but is treated as if it is persistent in subsequent calls. When we exit the function func_decl will still point to the stack allocated memory. We will use TemplateArgumentList::CreateCopy instead which will allocate memory out of the DeclContext.
Details
- Reviewers
teemperor JDevlieghere - Commits
- rGa0858e2f20c8: Fix CreateFunctionTemplateSpecialization to prevent dangling poiner to stack…
rL366365: Fix CreateFunctionTemplateSpecialization to prevent dangling poiner to stack…
rLLDB366365: Fix CreateFunctionTemplateSpecialization to prevent dangling poiner to stack…
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
I assume we never tested this and that's how didn't found this in sanitized builds?
But this patch LGTM. Thanks Shafik!
packages/Python/lldbsuite/test/expression_command/function_template_specialization_temp_args/main.cpp | ||
---|---|---|
1 ↗ | (On Diff #209965) | Pretty sure that file is clang-formatted (at least my clang-format doesn't modify this file) |
source/Symbol/ClangASTContext.cpp | ||
1619 ↗ | (On Diff #209965) | It's like an AST object stored in the ASTContext. |
packages/Python/lldbsuite/test/expression_command/function_template_specialization_temp_args/main.cpp | ||
---|---|---|
1 ↗ | (On Diff #209965) | We have a .clang-format file for the test directory which effectively disables clang-formatting. So depending on how you run clang-format, the invocation might be completely ignored. The .clang-format was put there before the Great Reformat to avoid it messing with the line numbers in tests. Maybe the time has come to do something about it... |
packages/Python/lldbsuite/test/expression_command/function_template_specialization_temp_args/main.cpp | ||
---|---|---|
1 ↗ | (On Diff #209965) | Sounds like a good idea. Most test should be using the // break here anyway, and removing the special .clang-format might flush out the ones that don't. |
source/Symbol/ClangASTContext.cpp | ||
1619 ↗ | (On Diff #209965) | Thanks |
packages/Python/lldbsuite/test/expression_command/function_template_specialization_temp_args/main.cpp | ||
---|---|---|
1 ↗ | (On Diff #209965) | I'm afraid that won't be enough. All of these tests were using // break here comments, but that wasn't enough because some(very, long, statement) // break here breaks at a slightly different place than some(very, long, statement) // break here Also, things like step-in/over are affected by how lines are broken up, and sometimes even comment it self is so long it doesn't fit ("please break on this line to inspect the state of foo"). However, I think we could do something via some combination of telling clang-format to not break certain comments (there's a way to set a regex to match non-breakable comments), increasing the line length, and making the comments themselves much shorter... |
packages/Python/lldbsuite/test/expression_command/function_template_specialization_temp_args/main.cpp | ||
---|---|---|
1 ↗ | (On Diff #209965) | Ahhh that makes sense, I was going to reply the same way @teemperor did. |
source/Symbol/ClangASTContext.cpp | ||
1619 ↗ | (On Diff #209965) | If you dig into the CreateCopy it does a Context.Allocate and these allocations will be released when the ASTContext is destroyed. |
packages/Python/lldbsuite/test/expression_command/function_template_specialization_temp_args/main.cpp | ||
---|---|---|
1 ↗ | (On Diff #209965) | Oh, I was totally unaware of that. That probably means I should double-check if some of my tests were actually clang-formatted :) |