Author: Tedlion Date: 2025-07-03T08:42:10+02:00 New Revision: 6504c96b1d865c69888a2a17aa8fe479987c00f0
URL: https://github.com/llvm/llvm-project/commit/6504c96b1d865c69888a2a17aa8fe479987c00f0 DIFF: https://github.com/llvm/llvm-project/commit/6504c96b1d865c69888a2a17aa8fe479987c00f0.diff LOG: [clang][analyzer] Fix the false positive ArgInitializedness warning on unnamed bit-field (#145066) For the following code in C mode: https://godbolt.org/z/3eo1MeGhe (There is no warning in C++ mode though). ```c++ struct B { int i : 2; int : 30; // unnamed bit-field }; extern void consume_B(struct B); void bitfield_B_init(void) { struct B b1; b1.i = 1; // b1 is initialized consume_B(b1); // FP: Passed-by-value struct argument contains uninitialized data (e.g., field: '') [core.CallAndMessage] } ``` Added: Modified: clang/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp clang/test/Analysis/call-and-message.c clang/test/Analysis/call-and-message.cpp Removed: ################################################################################ diff --git a/clang/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp index 86476b32309c3..23935647a5826 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp @@ -253,6 +253,8 @@ class FindUninitializedField { const RecordDecl *RD = RT->getDecl()->getDefinition(); assert(RD && "Referred record has no definition"); for (const auto *I : RD->fields()) { + if (I->isUnnamedBitField()) + continue; const FieldRegion *FR = MrMgr.getFieldRegion(I, R); FieldChain.push_back(I); T = I->getType(); diff --git a/clang/test/Analysis/call-and-message.c b/clang/test/Analysis/call-and-message.c index b79ec8c344b6c..ade51145e2a93 100644 --- a/clang/test/Analysis/call-and-message.c +++ b/clang/test/Analysis/call-and-message.c @@ -1,12 +1,19 @@ // RUN: %clang_analyze_cc1 %s -verify \ // RUN: -analyzer-checker=core \ // RUN: -analyzer-config core.CallAndMessage:ArgPointeeInitializedness=true \ +// RUN: -analyzer-config core.CallAndMessage:ArgInitializedness=false \ // RUN: -analyzer-output=plist -o %t.plist // RUN: cat %t.plist | FileCheck %s // RUN: %clang_analyze_cc1 %s -verify=no-pointee \ // RUN: -analyzer-checker=core \ -// RUN: -analyzer-config core.CallAndMessage:ArgPointeeInitializedness=false +// RUN: -analyzer-config core.CallAndMessage:ArgPointeeInitializedness=false \ +// RUN: -analyzer-config core.CallAndMessage:ArgInitializedness=false + +// RUN: %clang_analyze_cc1 %s -verify=arg-init \ +// RUN: -analyzer-checker=core \ +// RUN: -analyzer-config core.CallAndMessage:ArgPointeeInitializedness=false \ +// RUN: -analyzer-config core.CallAndMessage:ArgInitializedness=true // no-pointee-no-diagnostics @@ -22,3 +29,21 @@ void pointee_uninit(void) { // checker, as described in the CallAndMessage comments! // CHECK: <key>issue_hash_content_of_line_in_context</key> // CHECK-SAME: <string>97a74322d64dca40aa57303842c745a1</string> + +typedef struct { + int i :2; + int :30; // unnamed bit-field +} B; + +extern void consume_B(B); + +void bitfield_B_init(void) { + B b1; + b1.i = 1; // b1 is initialized + consume_B(b1); +} + +void bitfield_B_uninit(void) { + B b2; + consume_B(b2); // arg-init-warning{{Passed-by-value struct argument contains uninitialized data (e.g., field: 'i') [core.CallAndMessage]}} +} diff --git a/clang/test/Analysis/call-and-message.cpp b/clang/test/Analysis/call-and-message.cpp index 25ae23833478b..1e76973f49e13 100644 --- a/clang/test/Analysis/call-and-message.cpp +++ b/clang/test/Analysis/call-and-message.cpp @@ -169,4 +169,20 @@ void record_uninit() { // CHECK-SAME: <string>a46bb5c1ee44d4611ffeb13f7f499605</string> // CHECK: <key>issue_hash_content_of_line_in_context</key> // CHECK-SAME: <string>e0e0d30ea5a7b2e3a71e1931fa0768a5</string> + +struct B{ + int i :2; + int :30; // unnamed bit-field +}; + +void bitfield_B_init(void) { + B b1; + b1.i = 1; // b1 is initialized + consume(b1); +} + +void bitfield_B_uninit(void) { + B b2; + consume(b2); // arg-init-warning{{Passed-by-value struct argument contains uninitialized data (e.g., field: 'i') [core.CallAndMessage]}} +} } // namespace uninit_arg _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits