https://github.com/YLChenZ created 
https://github.com/llvm/llvm-project/pull/132457

Fixes #132001:

False positives generated by this issue can be avoided by skipping the check on 
the unnamed bitfield.

Here are my test results:
```
Testing Time: 49.22s

Total Discovered Tests: 990
  Unsupported      :  19 (1.92%)
  Passed           : 965 (97.47%)
  Expectedly Failed:   6 (0.61%)
```

>From 6051fecc179352d3690074506a918a91fb05c889 Mon Sep 17 00:00:00 2001
From: YLChenZ <chentongyon...@gmail.com>
Date: Sat, 22 Mar 2025 02:59:03 +0800
Subject: [PATCH] [clang][analyzer]: fix
 'clang-analyzer-optin.cplusplus.UninitializedObject false positive with
 unnamed fields'

---
 .../UninitializedObjectChecker.cpp               |  8 ++++++--
 clang/test/Analysis/unnamed_bitfield.cpp         | 16 ++++++++++++++++
 2 files changed, 22 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/Analysis/unnamed_bitfield.cpp

diff --git 
a/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp
 
b/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp
index 6e1222fedad3e..dadb206ba1197 100644
--- 
a/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp
+++ 
b/clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp
@@ -17,14 +17,15 @@
 //
 
//===----------------------------------------------------------------------===//
 
-#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h"
 #include "UninitializedObject.h"
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/Driver/DriverDiagnostic.h"
+#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h"
 #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
 #include "clang/StaticAnalyzer/Core/Checker.h"
 #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
 #include "clang/StaticAnalyzer/Core/PathSensitive/DynamicType.h"
+#include "clang/include/clang/AST/Decl.h"
 
 using namespace clang;
 using namespace clang::ento;
@@ -291,7 +292,10 @@ bool FindUninitializedFields::isNonUnionUninit(const 
TypedValueRegion *R,
 
   // Are all of this non-union's fields initialized?
   for (const FieldDecl *I : RD->fields()) {
-
+    // Skip checking for unnamed bitfield
+    if (I->isUnnamedBitField()) {
+      continue;
+    }
     const auto FieldVal =
         State->getLValue(I, loc::MemRegionVal(R)).castAs<loc::MemRegionVal>();
     const auto *FR = FieldVal.getRegionAs<FieldRegion>();
diff --git a/clang/test/Analysis/unnamed_bitfield.cpp 
b/clang/test/Analysis/unnamed_bitfield.cpp
new file mode 100644
index 0000000000000..56c9d56195a72
--- /dev/null
+++ b/clang/test/Analysis/unnamed_bitfield.cpp
@@ -0,0 +1,16 @@
+// RUN: %clang_analyze_cc1 
-analyzer-checker=optin.cplusplus.UninitializedObject -verify %s
+// expected-no-diagnostics
+
+struct S
+{
+    S(bool b)
+    : b(b)
+    {}
+    bool b{false};
+    long long : 7; // padding
+};
+
+void f()
+{
+    S s(true);
+}

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to