[clang] [clang-tools-extra] [clang analysis] ExprMutationAnalyzer avoid infinite recursion for recursive forwarding reference (PR #87954)
Florian Mayer via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 15 10:46:25 PDT 2024
fmayer wrote:
This broke the sanitizer bots, e.g. https://lab.llvm.org/buildbot/#/builders/239/builds/6587/steps/10/logs/stdio
```
[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from ExprMutationAnalyzerTest
[ RUN ] ExprMutationAnalyzerTest.UnresolvedOperator
[ OK ] ExprMutationAnalyzerTest.UnresolvedOperator (59 ms)
[ RUN ] ExprMutationAnalyzerTest.ReproduceFailureMinimal
input.cc:1:166: warning: unqualified call to 'std::forward' [-Wunqualified-std-cast-call]
1 | namespace std {template <class T> T &forward(T &A) { return static_cast<T&&>(A); }template <class T> struct __bind { T f; template <class V> __bind(T v, V &&) : f(forward(v)) {}};}void f() { int x = 42; auto Lambda = [] {}; std::__bind<decltype(Lambda)>(Lambda, x);}
| ^
| std::
input.cc:1:230: note: in instantiation of function template specialization 'std::__bind<(lambda at input.cc:1:222)>::__bind<int &>' requested here
1 | namespace std {template <class T> T &forward(T &A) { return static_cast<T&&>(A); }template <class T> struct __bind { T f; template <class V> __bind(T v, V &&) : f(forward(v)) {}};}void f() { int x = 42; auto Lambda = [] {}; std::__bind<decltype(Lambda)>(Lambda, x);}
| ^
[ OK ] ExprMutationAnalyzerTest.ReproduceFailureMinimal (46 ms)
[----------] 2 tests from ExprMutationAnalyzerTest (106 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (107 ms total)
[ PASSED ] 2 tests.
=================================================================
==946027==ERROR: LeakSanitizer: detected memory leaks
Indirect leak of 1024 byte(s) in 1 object(s) allocated from:
#0 0xaaaac90ddce4 in operator new(unsigned long, std::align_val_t) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/compiler-rt/lib/asan/asan_new_delete.cpp:98:3
#1 0xaaaaca15f590 in allocateBuckets /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:899:9
#2 0xaaaaca15f590 in llvm::DenseMap<clang::ParmVarDecl const*, clang::Stmt const*, llvm::DenseMapInfo<clang::ParmVarDecl const*, void>, llvm::detail::DenseMapPair<clang::ParmVarDecl const*, clang::Stmt const*>>::grow(unsigned int) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:833:5
#3 0xaaaaca15f428 in grow /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:564:36
#4 0xaaaaca15f428 in InsertIntoBucketImpl<const clang::ParmVarDecl *> /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h
#5 0xaaaaca15f428 in llvm::detail::DenseMapPair<clang::ParmVarDecl const*, clang::Stmt const*>* llvm::DenseMapBase<llvm::DenseMap<clang::ParmVarDecl const*, clang::Stmt const*, llvm::DenseMapInfo<clang::ParmVarDecl const*, void>, llvm::detail::DenseMapPair<clang::ParmVarDecl const*, clang::Stmt const*>>, clang::ParmVarDecl const*, clang::Stmt const*, llvm::DenseMapInfo<clang::ParmVarDecl const*, void>, llvm::detail::DenseMapPair<clang::ParmVarDecl const*, clang::Stmt const*>>::InsertIntoBucket<clang::ParmVarDecl const* const&>(llvm::detail::DenseMapPair<clang::ParmVarDecl const*, clang::Stmt const*>*, clang::ParmVarDecl const* const&) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:574:17
#6 0xaaaaca104ee8 in FindAndConstruct /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:353:13
#7 0xaaaaca104ee8 in operator[] /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/llvm/include/llvm/ADT/DenseMap.h:357:12
#8 0xaaaaca104ee8 in clang::FunctionParmMutationAnalyzer::findMutation(clang::ParmVarDecl const*) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/lib/Analysis/ExprMutationAnalyzer.cpp:685:3
#9 0xaaaaca0f64d4 in clang::ExprMutationAnalyzer::findFunctionArgMutation(clang::Expr const*) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/lib/Analysis/ExprMutationAnalyzer.cpp:645:23
#10 0xaaaaca0d5b30 in clang::ExprMutationAnalyzer::findMutationMemoized(clang::Expr const*, llvm::ArrayRef<clang::Stmt const* (clang::ExprMutationAnalyzer::*)(clang::Expr const*)>, llvm::DenseMap<clang::Expr const*, clang::Stmt const*, llvm::DenseMapInfo<clang::Expr const*, void>, llvm::detail::DenseMapPair<clang::Expr const*, clang::Stmt const*>>&) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/lib/Analysis/ExprMutationAnalyzer.cpp:237:25
#11 0xaaaaca0d5864 in clang::ExprMutationAnalyzer::findMutation(clang::Expr const*) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/lib/Analysis/ExprMutationAnalyzer.cpp:203:10
#12 0xaaaac9176f08 in isMutated /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h:34:44
#13 0xaaaac9176f08 in clang::(anonymous namespace)::isMutated(llvm::SmallVectorImpl<clang::ast_matchers::BoundNodes> const&, clang::ASTUnit*) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp:57:57
#14 0xaaaac91c2980 in clang::ExprMutationAnalyzerTest_ReproduceFailureMinimal_Test::TestBody() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp:1588:3
#15 0xaaaac93abff8 in HandleExceptionsInMethodIfSupported<testing::Test, void> /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc
#16 0xaaaac93abff8 in testing::Test::Run() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:2687:5
#17 0xaaaac93ae3b8 in testing::TestInfo::Run() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:2836:11
#18 0xaaaac93afc88 in testing::TestSuite::Run() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:3015:30
#19 0xaaaac93d0038 in testing::internal::UnitTestImpl::RunAllTests() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:5920:44
#20 0xaaaac93ce870 in HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc
#21 0xaaaac93ce870 in testing::UnitTest::Run() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:5484:10
#22 0xaaaac938e498 in RUN_ALL_TESTS /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/include/gtest/gtest.h:2317:73
#23 0xaaaac938e498 in main /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/UnitTestMain/TestMain.cpp:55:10
#24 0xffff96327580 (/lib/aarch64-linux-gnu/libc.so.6+0x27580) (BuildId: b9b95c4f6e0feae95b758633cb6a2881fa8eac30)
#25 0xffff96327654 in __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x27654) (BuildId: b9b95c4f6e0feae95b758633cb6a2881fa8eac30)
#26 0xaaaac900b6ac in _start (/b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm_build_asan/tools/clang/unittests/Analysis/ClangAnalysisTests+0x240b6ac)
Indirect leak of 128 byte(s) in 1 object(s) allocated from:
#0 0xaaaac90dd8c4 in operator new(unsigned long) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/compiler-rt/lib/asan/asan_new_delete.cpp:86:3
#1 0xaaaaca0f64f8 in clang::ExprMutationAnalyzer::findFunctionArgMutation(clang::Expr const*) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/lib/Analysis/ExprMutationAnalyzer.cpp:643:26
#2 0xaaaaca0d5b30 in clang::ExprMutationAnalyzer::findMutationMemoized(clang::Expr const*, llvm::ArrayRef<clang::Stmt const* (clang::ExprMutationAnalyzer::*)(clang::Expr const*)>, llvm::DenseMap<clang::Expr const*, clang::Stmt const*, llvm::DenseMapInfo<clang::Expr const*, void>, llvm::detail::DenseMapPair<clang::Expr const*, clang::Stmt const*>>&) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/lib/Analysis/ExprMutationAnalyzer.cpp:237:25
#3 0xaaaaca0d5864 in clang::ExprMutationAnalyzer::findMutation(clang::Expr const*) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/lib/Analysis/ExprMutationAnalyzer.cpp:203:10
#4 0xaaaac9176f08 in isMutated /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h:34:44
#5 0xaaaac9176f08 in clang::(anonymous namespace)::isMutated(llvm::SmallVectorImpl<clang::ast_matchers::BoundNodes> const&, clang::ASTUnit*) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp:57:57
#6 0xaaaac91c2980 in clang::ExprMutationAnalyzerTest_ReproduceFailureMinimal_Test::TestBody() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp:1588:3
#7 0xaaaac93abff8 in HandleExceptionsInMethodIfSupported<testing::Test, void> /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc
#8 0xaaaac93abff8 in testing::Test::Run() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:2687:5
#9 0xaaaac93ae3b8 in testing::TestInfo::Run() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:2836:11
#10 0xaaaac93afc88 in testing::TestSuite::Run() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:3015:30
#11 0xaaaac93d0038 in testing::internal::UnitTestImpl::RunAllTests() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:5920:44
#12 0xaaaac93ce870 in HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc
#13 0xaaaac93ce870 in testing::UnitTest::Run() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:5484:10
#14 0xaaaac938e498 in RUN_ALL_TESTS /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/include/gtest/gtest.h:2317:73
#15 0xaaaac938e498 in main /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/UnitTestMain/TestMain.cpp:55:10
#16 0xffff96327580 (/lib/aarch64-linux-gnu/libc.so.6+0x27580) (BuildId: b9b95c4f6e0feae95b758633cb6a2881fa8eac30)
#17 0xffff96327654 in __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x27654) (BuildId: b9b95c4f6e0feae95b758633cb6a2881fa8eac30)
#18 0xaaaac900b6ac in _start (/b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm_build_asan/tools/clang/unittests/Analysis/ClangAnalysisTests+0x240b6ac)
Indirect leak of 104 byte(s) in 1 object(s) allocated from:
#0 0xaaaac90dd8c4 in operator new(unsigned long) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/compiler-rt/lib/asan/asan_new_delete.cpp:86:3
#1 0xaaaac9176e10 in __libcpp_operator_new<unsigned long> /b/sanitizer-aarch64-linux-bootstrap-asan/build/libcxx_build_asan/include/c++/v1/new:270:10
#2 0xaaaac9176e10 in __libcpp_allocate /b/sanitizer-aarch64-linux-bootstrap-asan/build/libcxx_build_asan/include/c++/v1/new:294:10
#3 0xaaaac9176e10 in allocate /b/sanitizer-aarch64-linux-bootstrap-asan/build/libcxx_build_asan/include/c++/v1/__memory/allocator.h:119:32
#4 0xaaaac9176e10 in allocate /b/sanitizer-aarch64-linux-bootstrap-asan/build/libcxx_build_asan/include/c++/v1/__memory/allocator_traits.h:280:16
#5 0xaaaac9176e10 in __allocation_guard<std::__1::allocator<clang::ExprMutationAnalyzer::Cache> > /b/sanitizer-aarch64-linux-bootstrap-asan/build/libcxx_build_asan/include/c++/v1/__memory/allocation_guard.h:56:16
#6 0xaaaac9176e10 in allocate_shared<clang::ExprMutationAnalyzer::Cache, std::__1::allocator<clang::ExprMutationAnalyzer::Cache>, 0> /b/sanitizer-aarch64-linux-bootstrap-asan/build/libcxx_build_asan/include/c++/v1/__memory/shared_ptr.h:824:46
#7 0xaaaac9176e10 in make_shared<clang::ExprMutationAnalyzer::Cache, 0> /b/sanitizer-aarch64-linux-bootstrap-asan/build/libcxx_build_asan/include/c++/v1/__memory/shared_ptr.h:833:10
#8 0xaaaac9176e10 in ExprMutationAnalyzer /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/include/clang/Analysis/Analyses/ExprMutationAnalyzer.h:32:44
#9 0xaaaac9176e10 in clang::(anonymous namespace)::isMutated(llvm::SmallVectorImpl<clang::ast_matchers::BoundNodes> const&, clang::ASTUnit*) /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp:57:10
#10 0xaaaac91c2980 in clang::ExprMutationAnalyzerTest_ReproduceFailureMinimal_Test::TestBody() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp:1588:3
#11 0xaaaac93abff8 in HandleExceptionsInMethodIfSupported<testing::Test, void> /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc
#12 0xaaaac93abff8 in testing::Test::Run() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:2687:5
#13 0xaaaac93ae3b8 in testing::TestInfo::Run() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:2836:11
#14 0xaaaac93afc88 in testing::TestSuite::Run() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:3015:30
#15 0xaaaac93d0038 in testing::internal::UnitTestImpl::RunAllTests() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:5920:44
#16 0xaaaac93ce870 in HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc
#17 0xaaaac93ce870 in testing::UnitTest::Run() /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/src/gtest.cc:5484:10
#18 0xaaaac938e498 in RUN_ALL_TESTS /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/googletest/include/gtest/gtest.h:2317:73
#19 0xaaaac938e498 in main /b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm-project/third-party/unittest/UnitTestMain/TestMain.cpp:55:10
#20 0xffff96327580 (/lib/aarch64-linux-gnu/libc.so.6+0x27580) (BuildId: b9b95c4f6e0feae95b758633cb6a2881fa8eac30)
#21 0xffff96327654 in __libc_start_main (/lib/aarch64-linux-gnu/libc.so.6+0x27654) (BuildId: b9b95c4f6e0feae95b758633cb6a2881fa8eac30)
#22 0xaaaac900b6ac in _start (/b/sanitizer-aarch64-linux-bootstrap-asan/build/llvm_build_asan/tools/clang/unittests/Analysis/ClangAnalysisTests+0x240b6ac)
SUMMARY: AddressSanitizer: 1256 byte(s) leaked in 3 allocation(s).
--
exit: 1
--
```
https://github.com/llvm/llvm-project/pull/87954
More information about the cfe-commits
mailing list