Skip to content

Commit 23ca966

Browse files
committedAug 13, 2018
[analyzer][UninitializedObjectChecker] Refactoring p5.: Handle pedantic mode in the checker class only
Differential Revision: https://reviews.llvm.org/D50508 llvm-svn: 339601
1 parent 3521379 commit 23ca966

File tree

2 files changed

+19
-14
lines changed

2 files changed

+19
-14
lines changed
 

‎clang/lib/StaticAnalyzer/Checkers/UninitializedObject/UninitializedObject.h

+9-4
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,7 @@ class FindUninitializedFields {
111111
ProgramStateRef State;
112112
const TypedValueRegion *const ObjectR;
113113

114-
const bool IsPedantic;
115114
const bool CheckPointeeInitialization;
116-
117115
bool IsAnyFieldInitialized = false;
118116

119117
FieldChainInfo::FieldChain::Factory ChainFactory;
@@ -131,10 +129,17 @@ class FindUninitializedFields {
131129
UninitFieldMap UninitFields;
132130

133131
public:
132+
/// Constructs the FindUninitializedField object, searches for and stores
133+
/// uninitialized fields in R.
134134
FindUninitializedFields(ProgramStateRef State,
135-
const TypedValueRegion *const R, bool IsPedantic,
135+
const TypedValueRegion *const R,
136136
bool CheckPointeeInitialization);
137-
const UninitFieldMap &getUninitFields();
137+
138+
const UninitFieldMap &getUninitFields() { return UninitFields; }
139+
140+
/// Returns whether the analyzed region contains at least one initialized
141+
/// field.
142+
bool isAnyFieldInitialized() { return IsAnyFieldInitialized; }
138143

139144
private:
140145
// For the purposes of this checker, we'll regard the object under checking as

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

+10-10
Original file line numberDiff line numberDiff line change
@@ -136,14 +136,20 @@ void UninitializedObjectChecker::checkEndFunction(
136136
if (!Object)
137137
return;
138138

139-
FindUninitializedFields F(Context.getState(), Object->getRegion(), IsPedantic,
139+
FindUninitializedFields F(Context.getState(), Object->getRegion(),
140140
CheckPointeeInitialization);
141141

142142
const UninitFieldMap &UninitFields = F.getUninitFields();
143143

144144
if (UninitFields.empty())
145145
return;
146146

147+
// In non-pedantic mode, if Object's region doesn't contain a single
148+
// initialized field, we'll assume that Object was intentionally left
149+
// uninitialized.
150+
if (!IsPedantic && !F.isAnyFieldInitialized())
151+
return;
152+
147153
// There are uninitialized fields in the record.
148154

149155
ExplodedNode *Node = Context.generateNonFatalErrorNode(Context.getState());
@@ -192,18 +198,12 @@ void UninitializedObjectChecker::checkEndFunction(
192198
//===----------------------------------------------------------------------===//
193199

194200
FindUninitializedFields::FindUninitializedFields(
195-
ProgramStateRef State, const TypedValueRegion *const R, bool IsPedantic,
201+
ProgramStateRef State, const TypedValueRegion *const R,
196202
bool CheckPointeeInitialization)
197-
: State(State), ObjectR(R), IsPedantic(IsPedantic),
198-
CheckPointeeInitialization(CheckPointeeInitialization) {}
203+
: State(State), ObjectR(R),
204+
CheckPointeeInitialization(CheckPointeeInitialization) {
199205

200-
const UninitFieldMap &FindUninitializedFields::getUninitFields() {
201206
isNonUnionUninit(ObjectR, FieldChainInfo(ChainFactory));
202-
203-
if (!IsPedantic && !IsAnyFieldInitialized)
204-
UninitFields.clear();
205-
206-
return UninitFields;
207207
}
208208

209209
bool FindUninitializedFields::addFieldToUninits(FieldChainInfo Chain) {

0 commit comments

Comments
 (0)
Please sign in to comment.