Author: Balazs Benics Date: 2025-05-07T21:51:13+02:00 New Revision: 0b41866c10dae9e4c877475112e426969062feea
URL: https://github.com/llvm/llvm-project/commit/0b41866c10dae9e4c877475112e426969062feea DIFF: https://github.com/llvm/llvm-project/commit/0b41866c10dae9e4c877475112e426969062feea.diff LOG: Revert "[analyzer] Make it a noop when initializing a field of empty record (…" This reverts commit db38cc27bc61cf2d53bcac1203722853610aa073. Added: Modified: clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp Removed: clang/test/Analysis/issue-137252.cpp ################################################################################ diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index ff07402a29bba..92ce3fa2225c8 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp @@ -10,7 +10,6 @@ // //===----------------------------------------------------------------------===// -#include "clang/AST/ASTContext.h" #include "clang/AST/AttrIterator.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/ParentMap.h" @@ -716,11 +715,7 @@ void ExprEngine::handleConstructor(const Expr *E, // actually make things worse. Placement new makes this tricky as well, // since it's then possible to be initializing one part of a multi- // dimensional array. - const CXXRecordDecl *TargetHeldRecord = - cast<CXXRecordDecl>(CE->getType()->getAsRecordDecl()); - - if (!TargetHeldRecord || !TargetHeldRecord->isEmpty()) - State = State->bindDefaultZero(Target, LCtx); + State = State->bindDefaultZero(Target, LCtx); } Bldr.generateNode(CE, N, State, /*tag=*/nullptr, diff --git a/clang/test/Analysis/issue-137252.cpp b/clang/test/Analysis/issue-137252.cpp deleted file mode 100644 index 6ca3e20ccbbca..0000000000000 --- a/clang/test/Analysis/issue-137252.cpp +++ /dev/null @@ -1,50 +0,0 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus -verify %s -// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus -verify %s -DEMPTY_CLASS -// UNSUPPORTED: system-windows -// expected-no-diagnostics - -// This test reproduces the issue that previously the static analyzer -// initialized an [[no_unique_address]] empty field to zero, -// over-writing a non-empty field with the same offset. - -namespace std { -#ifdef EMPTY_CLASS - - struct default_delete {}; - template <class _Tp, class _Dp = default_delete > -#else - // Class with methods and static members is still empty: - template <typename T> - class default_delete { - T dump(); - static T x; - }; - template <class _Tp, class _Dp = default_delete<_Tp> > -#endif - class unique_ptr { - [[no_unique_address]] _Tp * __ptr_; - [[no_unique_address]] _Dp __deleter_; - - public: - explicit unique_ptr(_Tp* __p) noexcept - : __ptr_(__p), - __deleter_() {} - - ~unique_ptr() { - delete __ptr_; - } - }; -} - -struct X {}; - -int main() -{ - // Previously a leak falsely reported here. It was because the - // Static Analyzer engine simulated the initialization of - // `__deleter__` incorrectly. The engine assigned zero to - // `__deleter__`--an empty record sharing offset with `__ptr__`. - // The assignment over wrote `__ptr__`. - std::unique_ptr<X> a(new X()); - return 0; -} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits