[clang] [clang][analyzer]: fix 'UninitializedObject false positive with unnamed fields' (PR #132457)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 21 12:20:42 PDT 2025
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 <chentongyongcz at 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);
+}
More information about the cfe-commits
mailing list