Skip to content

Commit 99e8321

Browse files
kr-2003YLChenZ
andauthored
[clang][analyzer] Ignore unnamed bitfields in UninitializedObjectChecker (#132427)
Fixes #132001 Co-authored-by: YLChenZ <chentongyongcz@gmail.com>
1 parent 1f291ac commit 99e8321

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObjectChecker.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,9 @@ bool FindUninitializedFields::isNonUnionUninit(const TypedValueRegion *R,
291291

292292
// Are all of this non-union's fields initialized?
293293
for (const FieldDecl *I : RD->fields()) {
294-
294+
if (I->isUnnamedBitField()) {
295+
continue;
296+
}
295297
const auto FieldVal =
296298
State->getLValue(I, loc::MemRegionVal(R)).castAs<loc::MemRegionVal>();
297299
const auto *FR = FieldVal.getRegionAs<FieldRegion>();

clang/test/Analysis/cxx-uninitialized-object.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,3 +1182,24 @@ void fComplexTest() {
11821182
// TODO: we should emit a warning for x2.x and x2.y.
11831183
ComplexUninitTest x2;
11841184
}
1185+
1186+
struct PaddingBitfieldTest {
1187+
int a;
1188+
long long : 7; // padding, previously flagged as uninitialized
1189+
PaddingBitfieldTest(int a) : a(a) {}
1190+
};
1191+
1192+
void fPaddingBitfieldTest() {
1193+
PaddingBitfieldTest pb(42);
1194+
// no-warning: Unnamed bitfield is now ignored, fixing false positive
1195+
}
1196+
1197+
struct NamedBitfieldTest {
1198+
int b;
1199+
long long named : 7; // expected-note{{uninitialized field 'this->named'}}
1200+
NamedBitfieldTest(int b) : b(b) {} // expected-warning{{1 uninitialized field at the end of the constructor call}}
1201+
};
1202+
1203+
void fNamedBitfieldTest() {
1204+
NamedBitfieldTest nb(42);
1205+
}

0 commit comments

Comments
 (0)