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