Skip to content
This repository was archived by the owner on Nov 1, 2021. It is now read-only.

Commit 053c88b

Browse files
committed
Revert "[analyzer] Handle zeroing CXXConstructExprs."
Per review from Anna, this really should have been two commits, and besides it's causing problems on our internal buildbot. Reverting until these have been worked out. This reverts r184511 / 9812328. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@184561 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 8f5d7d1 commit 053c88b

File tree

3 files changed

+78
-124
lines changed

3 files changed

+78
-124
lines changed

Diff for: lib/StaticAnalyzer/Core/ExprEngineCXX.cpp

+10-49
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,6 @@ void ExprEngine::VisitCXXConstructExpr(const CXXConstructExpr *CE,
176176
}
177177

178178
// FIXME: This will eventually need to handle new-expressions as well.
179-
// Don't forget to update the pre-constructor initialization code below.
180179
}
181180

182181
// If we couldn't find an existing region to construct into, assume we're
@@ -216,60 +215,22 @@ void ExprEngine::VisitCXXConstructExpr(const CXXConstructExpr *CE,
216215

217216
ExplodedNodeSet DstPreVisit;
218217
getCheckerManager().runCheckersForPreStmt(DstPreVisit, Pred, CE, *this);
219-
220-
bool IsArray = isa<ElementRegion>(Target);
221-
ExplodedNodeSet PreInitialized;
222-
{
223-
StmtNodeBuilder Bldr(DstPreVisit, PreInitialized, *currBldrCtx);
224-
if (CE->requiresZeroInitialization()) {
225-
// Type of the zero doesn't matter.
226-
SVal ZeroVal = svalBuilder.makeZeroVal(getContext().CharTy);
227-
228-
for (ExplodedNodeSet::iterator I = DstPreVisit.begin(),
229-
E = DstPreVisit.end();
230-
I != E; ++I) {
231-
ProgramStateRef State = (*I)->getState();
232-
// FIXME: Once we properly handle constructors in new-expressions, we'll
233-
// need to invalidate the region before setting a default value, to make
234-
// sure there aren't any lingering bindings around. This probably needs
235-
// to happen regardless of whether or not the object is zero-initialized
236-
// to handle random fields of a placement-initialized object picking up
237-
// old bindings. We might only want to do it when we need to, though.
238-
// FIXME: This isn't actually correct for arrays -- we need to zero-
239-
// initialize the entire array, not just the first element -- but our
240-
// handling of arrays everywhere else is weak as well, so this shouldn't
241-
// actually make things worse.
242-
State = State->bindDefault(loc::MemRegionVal(Target), ZeroVal);
243-
Bldr.generateNode(CE, *I, State, /*tag=*/0, ProgramPoint::PreStmtKind);
244-
}
245-
}
246-
}
247-
248218
ExplodedNodeSet DstPreCall;
249-
getCheckerManager().runCheckersForPreCall(DstPreCall, PreInitialized,
219+
getCheckerManager().runCheckersForPreCall(DstPreCall, DstPreVisit,
250220
*Call, *this);
251221

252222
ExplodedNodeSet DstEvaluated;
253223
StmtNodeBuilder Bldr(DstPreCall, DstEvaluated, *currBldrCtx);
254224

255-
if (CE->getConstructor()->isTrivial() && !IsArray) {
256-
if (CE->getConstructor()->isCopyOrMoveConstructor()) {
257-
for (ExplodedNodeSet::iterator I = DstPreCall.begin(),
258-
E = DstPreCall.end();
259-
I != E; ++I)
260-
performTrivialCopy(Bldr, *I, *Call);
261-
} else {
262-
assert(CE->getConstructor()->isDefaultConstructor());
263-
264-
// We still have to bind the return value.
265-
for (ExplodedNodeSet::iterator I = DstPreCall.begin(),
266-
E = DstPreCall.end();
267-
I != E; ++I) {
268-
ProgramStateRef State = (*I)->getState();
269-
State = bindReturnValue(*Call, LCtx, State);
270-
Bldr.generateNode(CE, *I, State);
271-
}
272-
}
225+
bool IsArray = isa<ElementRegion>(Target);
226+
if (CE->getConstructor()->isTrivial() &&
227+
CE->getConstructor()->isCopyOrMoveConstructor() &&
228+
!IsArray) {
229+
// FIXME: Handle other kinds of trivial constructors as well.
230+
for (ExplodedNodeSet::iterator I = DstPreCall.begin(), E = DstPreCall.end();
231+
I != E; ++I)
232+
performTrivialCopy(Bldr, *I, *Call);
233+
273234
} else {
274235
for (ExplodedNodeSet::iterator I = DstPreCall.begin(), E = DstPreCall.end();
275236
I != E; ++I)

Diff for: test/Analysis/ctor.mm renamed to test/Analysis/ctor-inlining.mm

-75
Original file line numberDiff line numberDiff line change
@@ -500,78 +500,3 @@ void testNonPODDefaulted() {
500500
clang_analyzer_eval(c.values[2].x == 3); // expected-warning{{UNKNOWN}}
501501
}
502502
};
503-
504-
namespace ZeroInitialization {
505-
struct raw_pair {
506-
int p1;
507-
int p2;
508-
};
509-
510-
void testVarDecl() {
511-
raw_pair p{};
512-
clang_analyzer_eval(p.p1 == 0); // expected-warning{{TRUE}}
513-
clang_analyzer_eval(p.p2 == 0); // expected-warning{{TRUE}}
514-
}
515-
516-
void testTemporary() {
517-
clang_analyzer_eval(raw_pair().p1 == 0); // expected-warning{{TRUE}}
518-
clang_analyzer_eval(raw_pair().p2 == 0); // expected-warning{{TRUE}}
519-
}
520-
521-
void testArray() {
522-
raw_pair p[2] = {};
523-
clang_analyzer_eval(p[0].p1 == 0); // expected-warning{{TRUE}}
524-
clang_analyzer_eval(p[0].p2 == 0); // expected-warning{{TRUE}}
525-
clang_analyzer_eval(p[1].p1 == 0); // expected-warning{{TRUE}}
526-
clang_analyzer_eval(p[1].p2 == 0); // expected-warning{{TRUE}}
527-
}
528-
529-
void testNew() {
530-
// FIXME: Pending proper implementation of constructors for 'new'.
531-
raw_pair *pp = new raw_pair();
532-
clang_analyzer_eval(pp->p1 == 0); // expected-warning{{UNKNOWN}}
533-
clang_analyzer_eval(pp->p2 == 0); // expected-warning{{UNKNOWN}}
534-
}
535-
536-
void testArrayNew() {
537-
// FIXME: Pending proper implementation of constructors for 'new[]'.
538-
raw_pair *p = new raw_pair[2]();
539-
clang_analyzer_eval(p[0].p1 == 0); // expected-warning{{UNKNOWN}}
540-
clang_analyzer_eval(p[0].p2 == 0); // expected-warning{{UNKNOWN}}
541-
clang_analyzer_eval(p[1].p1 == 0); // expected-warning{{UNKNOWN}}
542-
clang_analyzer_eval(p[1].p2 == 0); // expected-warning{{UNKNOWN}}
543-
}
544-
545-
struct initializing_pair {
546-
public:
547-
int x;
548-
raw_pair y;
549-
initializing_pair() : x(), y() {}
550-
};
551-
552-
void testFieldInitializers() {
553-
initializing_pair p;
554-
clang_analyzer_eval(p.x == 0); // expected-warning{{TRUE}}
555-
clang_analyzer_eval(p.y.p1 == 0); // expected-warning{{TRUE}}
556-
clang_analyzer_eval(p.y.p2 == 0); // expected-warning{{TRUE}}
557-
}
558-
559-
struct subclass : public raw_pair {
560-
subclass() = default;
561-
};
562-
563-
void testSubclass() {
564-
subclass p;
565-
clang_analyzer_eval(p.p1 == 0); // expected-warning{{garbage}}
566-
}
567-
568-
struct initializing_subclass : public raw_pair {
569-
initializing_subclass() : raw_pair() {}
570-
};
571-
572-
void testInitializingSubclass() {
573-
initializing_subclass p;
574-
clang_analyzer_eval(p.p1 == 0); // expected-warning{{TRUE}}
575-
clang_analyzer_eval(p.p2 == 0); // expected-warning{{TRUE}}
576-
}
577-
}

Diff for: test/Analysis/inlining/path-notes.cpp

+68
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,40 @@ int callGenerateNoteOnDefaultArgument(int o) {
300300
// CHECK-NEXT: <key>end</key>
301301
// CHECK-NEXT: <array>
302302
// CHECK-NEXT: <dict>
303+
// CHECK-NEXT: <key>line</key><integer>31</integer>
304+
// CHECK-NEXT: <key>col</key><integer>7</integer>
305+
// CHECK-NEXT: <key>file</key><integer>0</integer>
306+
// CHECK-NEXT: </dict>
307+
// CHECK-NEXT: <dict>
308+
// CHECK-NEXT: <key>line</key><integer>31</integer>
309+
// CHECK-NEXT: <key>col</key><integer>7</integer>
310+
// CHECK-NEXT: <key>file</key><integer>0</integer>
311+
// CHECK-NEXT: </dict>
312+
// CHECK-NEXT: </array>
313+
// CHECK-NEXT: </dict>
314+
// CHECK-NEXT: </array>
315+
// CHECK-NEXT: </dict>
316+
// CHECK-NEXT: <dict>
317+
// CHECK-NEXT: <key>kind</key><string>control</string>
318+
// CHECK-NEXT: <key>edges</key>
319+
// CHECK-NEXT: <array>
320+
// CHECK-NEXT: <dict>
321+
// CHECK-NEXT: <key>start</key>
322+
// CHECK-NEXT: <array>
323+
// CHECK-NEXT: <dict>
324+
// CHECK-NEXT: <key>line</key><integer>31</integer>
325+
// CHECK-NEXT: <key>col</key><integer>7</integer>
326+
// CHECK-NEXT: <key>file</key><integer>0</integer>
327+
// CHECK-NEXT: </dict>
328+
// CHECK-NEXT: <dict>
329+
// CHECK-NEXT: <key>line</key><integer>31</integer>
330+
// CHECK-NEXT: <key>col</key><integer>7</integer>
331+
// CHECK-NEXT: <key>file</key><integer>0</integer>
332+
// CHECK-NEXT: </dict>
333+
// CHECK-NEXT: </array>
334+
// CHECK-NEXT: <key>end</key>
335+
// CHECK-NEXT: <array>
336+
// CHECK-NEXT: <dict>
303337
// CHECK-NEXT: <key>line</key><integer>32</integer>
304338
// CHECK-NEXT: <key>col</key><integer>3</integer>
305339
// CHECK-NEXT: <key>file</key><integer>0</integer>
@@ -853,6 +887,40 @@ int callGenerateNoteOnDefaultArgument(int o) {
853887
// CHECK-NEXT: <key>end</key>
854888
// CHECK-NEXT: <array>
855889
// CHECK-NEXT: <dict>
890+
// CHECK-NEXT: <key>line</key><integer>44</integer>
891+
// CHECK-NEXT: <key>col</key><integer>5</integer>
892+
// CHECK-NEXT: <key>file</key><integer>0</integer>
893+
// CHECK-NEXT: </dict>
894+
// CHECK-NEXT: <dict>
895+
// CHECK-NEXT: <key>line</key><integer>44</integer>
896+
// CHECK-NEXT: <key>col</key><integer>13</integer>
897+
// CHECK-NEXT: <key>file</key><integer>0</integer>
898+
// CHECK-NEXT: </dict>
899+
// CHECK-NEXT: </array>
900+
// CHECK-NEXT: </dict>
901+
// CHECK-NEXT: </array>
902+
// CHECK-NEXT: </dict>
903+
// CHECK-NEXT: <dict>
904+
// CHECK-NEXT: <key>kind</key><string>control</string>
905+
// CHECK-NEXT: <key>edges</key>
906+
// CHECK-NEXT: <array>
907+
// CHECK-NEXT: <dict>
908+
// CHECK-NEXT: <key>start</key>
909+
// CHECK-NEXT: <array>
910+
// CHECK-NEXT: <dict>
911+
// CHECK-NEXT: <key>line</key><integer>44</integer>
912+
// CHECK-NEXT: <key>col</key><integer>5</integer>
913+
// CHECK-NEXT: <key>file</key><integer>0</integer>
914+
// CHECK-NEXT: </dict>
915+
// CHECK-NEXT: <dict>
916+
// CHECK-NEXT: <key>line</key><integer>44</integer>
917+
// CHECK-NEXT: <key>col</key><integer>13</integer>
918+
// CHECK-NEXT: <key>file</key><integer>0</integer>
919+
// CHECK-NEXT: </dict>
920+
// CHECK-NEXT: </array>
921+
// CHECK-NEXT: <key>end</key>
922+
// CHECK-NEXT: <array>
923+
// CHECK-NEXT: <dict>
856924
// CHECK-NEXT: <key>line</key><integer>46</integer>
857925
// CHECK-NEXT: <key>col</key><integer>3</integer>
858926
// CHECK-NEXT: <key>file</key><integer>0</integer>

0 commit comments

Comments
 (0)