[clang] Revert "[analyzer] Make it a noop when initializing a field of empty record" (PR #138951)

via cfe-commits cfe-commits at lists.llvm.org
Wed May 7 12:52:39 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Balazs Benics (steakhal)

<details>
<summary>Changes</summary>

Reverts llvm/llvm-project#<!-- -->138594

Crashes, see: https://lab.llvm.org/buildbot/#/builders/144/builds/24534

---
Full diff: https://github.com/llvm/llvm-project/pull/138951.diff


2 Files Affected:

- (modified) clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp (+1-6) 
- (removed) clang/test/Analysis/issue-137252.cpp (-50) 


``````````diff
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;
-}

``````````

</details>


https://github.com/llvm/llvm-project/pull/138951


More information about the cfe-commits mailing list