]> granicus.if.org Git - clang/commitdiff
[analyzer][UninitializedObjectChecker] Refactoring p5.: Handle pedantic mode in the...
authorKristof Umann <dkszelethus@gmail.com>
Mon, 13 Aug 2018 18:48:34 +0000 (18:48 +0000)
committerKristof Umann <dkszelethus@gmail.com>
Mon, 13 Aug 2018 18:48:34 +0000 (18:48 +0000)
Differential Revision: https://reviews.llvm.org/D50508

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@339601 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 095a1e607d808e44d8ecdd62f8a79fb9a97ace44..07751a92360346592edf6a5af37306f2d24b2115 100644 (file)
@@ -111,9 +111,7 @@ class FindUninitializedFields {
   ProgramStateRef State;
   const TypedValueRegion *const ObjectR;
 
-  const bool IsPedantic;
   const bool CheckPointeeInitialization;
-
   bool IsAnyFieldInitialized = false;
 
   FieldChainInfo::FieldChain::Factory ChainFactory;
@@ -131,10 +129,17 @@ class FindUninitializedFields {
   UninitFieldMap UninitFields;
 
 public:
+  /// Constructs the FindUninitializedField object, searches for and stores
+  /// uninitialized fields in R.
   FindUninitializedFields(ProgramStateRef State,
-                          const TypedValueRegion *const R, bool IsPedantic,
+                          const TypedValueRegion *const R,
                           bool CheckPointeeInitialization);
-  const UninitFieldMap &getUninitFields();
+
+  const UninitFieldMap &getUninitFields() { return UninitFields; }
+
+  /// Returns whether the analyzed region contains at least one initialized
+  /// field.
+  bool isAnyFieldInitialized() { return IsAnyFieldInitialized; }
 
 private:
   // For the purposes of this checker, we'll regard the object under checking as
index c2f4b053fdd82a9473b4f52744afdad0d2b5b4c7..876aebb477c478a79c25a3511faecd80d0f206c8 100644 (file)
@@ -136,7 +136,7 @@ void UninitializedObjectChecker::checkEndFunction(
   if (!Object)
     return;
 
-  FindUninitializedFields F(Context.getState(), Object->getRegion(), IsPedantic,
+  FindUninitializedFields F(Context.getState(), Object->getRegion(),
                             CheckPointeeInitialization);
 
   const UninitFieldMap &UninitFields = F.getUninitFields();
@@ -144,6 +144,12 @@ void UninitializedObjectChecker::checkEndFunction(
   if (UninitFields.empty())
     return;
 
+  // In non-pedantic mode, if Object's region doesn't contain a single
+  // initialized field, we'll assume that Object was intentionally left
+  // uninitialized.
+  if (!IsPedantic && !F.isAnyFieldInitialized())
+    return;
+
   // There are uninitialized fields in the record.
 
   ExplodedNode *Node = Context.generateNonFatalErrorNode(Context.getState());
@@ -192,18 +198,12 @@ void UninitializedObjectChecker::checkEndFunction(
 //===----------------------------------------------------------------------===//
 
 FindUninitializedFields::FindUninitializedFields(
-    ProgramStateRef State, const TypedValueRegion *const R, bool IsPedantic,
+    ProgramStateRef State, const TypedValueRegion *const R,
     bool CheckPointeeInitialization)
-    : State(State), ObjectR(R), IsPedantic(IsPedantic),
-      CheckPointeeInitialization(CheckPointeeInitialization) {}
+    : State(State), ObjectR(R),
+      CheckPointeeInitialization(CheckPointeeInitialization) {
 
-const UninitFieldMap &FindUninitializedFields::getUninitFields() {
   isNonUnionUninit(ObjectR, FieldChainInfo(ChainFactory));
-
-  if (!IsPedantic && !IsAnyFieldInitialized)
-    UninitFields.clear();
-
-  return UninitFields;
 }
 
 bool FindUninitializedFields::addFieldToUninits(FieldChainInfo Chain) {