[llvm-branch-commits] [clang] 0b41866 - Revert "[analyzer] Make it a noop when initializing a field of empty record (…"
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed May 7 12:51:16 PDT 2025
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;
-}
More information about the llvm-branch-commits
mailing list