[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