[cfe-commits] r152730 - in /cfe/trunk: lib/StaticAnalyzer/Core/AggExprVisitor.cpp lib/StaticAnalyzer/Core/ExprEngine.cpp test/Analysis/nullptr.cpp
Erik Verbruggen
erikjv at me.com
Wed Mar 14 11:01:43 PDT 2012
Author: erikjv
Date: Wed Mar 14 13:01:43 2012
New Revision: 152730
URL: http://llvm.org/viewvc/llvm-project?rev=152730&view=rev
Log:
[Analyser] Remove unnecessary recursive visits for ExprWithCleanups and
MaterializeTemporaryExpr.
Modified:
cfe/trunk/lib/StaticAnalyzer/Core/AggExprVisitor.cpp
cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
cfe/trunk/test/Analysis/nullptr.cpp
Modified: cfe/trunk/lib/StaticAnalyzer/Core/AggExprVisitor.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/AggExprVisitor.cpp?rev=152730&r1=152729&r2=152730&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/AggExprVisitor.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/AggExprVisitor.cpp Wed Mar 14 13:01:43 2012
@@ -50,6 +50,8 @@
case CK_NoOp:
case CK_ConstructorConversion:
case CK_UserDefinedConversion:
+ // FIXME: The CFG is fully linearised, so a recursive visit is probably not
+ // needed anymore.
Visit(E->getSubExpr());
break;
}
@@ -60,6 +62,8 @@
}
void AggExprVisitor::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
+ // FIXME: The CFG is fully linearised, so a recursive visit is probably not
+ // needed anymore.
Eng.Visit(E, Pred, DstSet);
}
Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=152730&r1=152729&r2=152730&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp Wed Mar 14 13:01:43 2012
@@ -363,29 +363,22 @@
SVal thisVal = Pred->getState()->getSVal(thisReg);
if (BMI->isAnyMemberInitializer()) {
- ExplodedNodeSet AfterEval;
-
// Evaluate the initializer.
- Visit(BMI->getInit(), Pred, AfterEval);
- StmtNodeBuilder Bldr(AfterEval, Dst, *currentBuilderContext);
- for (ExplodedNodeSet::iterator I = AfterEval.begin(),
- E = AfterEval.end(); I != E; ++I){
- ExplodedNode *P = *I;
- ProgramStateRef state = P->getState();
-
- const FieldDecl *FD = BMI->getAnyMember();
-
- SVal FieldLoc = state->getLValue(FD, thisVal);
- SVal InitVal = state->getSVal(BMI->getInit(), Pred->getLocationContext());
- state = state->bindLoc(FieldLoc, InitVal);
-
- // Use a custom node building process.
- PostInitializer PP(BMI, stackFrame);
- // Builder automatically add the generated node to the deferred set,
- // which are processed in the builder's dtor.
- Bldr.generateNode(PP, P, state);
- }
+ StmtNodeBuilder Bldr(Pred, Dst, *currentBuilderContext);
+ ProgramStateRef state = Pred->getState();
+
+ const FieldDecl *FD = BMI->getAnyMember();
+
+ SVal FieldLoc = state->getLValue(FD, thisVal);
+ SVal InitVal = state->getSVal(BMI->getInit(), Pred->getLocationContext());
+ state = state->bindLoc(FieldLoc, InitVal);
+
+ // Use a custom node building process.
+ PostInitializer PP(BMI, stackFrame);
+ // Builder automatically add the generated node to the deferred set,
+ // which are processed in the builder's dtor.
+ Bldr.generateNode(PP, Pred, state);
} else {
assert(BMI->isBaseInitializer());
@@ -574,9 +567,7 @@
}
case Stmt::ExprWithCleanupsClass:
- Bldr.takeNodes(Pred);
- Visit(cast<ExprWithCleanups>(S)->getSubExpr(), Pred, Dst);
- Bldr.addNodes(Dst);
+ // Handled due to fully linearised CFG.
break;
// Cases not handled yet; but will handle some day.
@@ -835,10 +826,10 @@
Bldr.takeNodes(Pred);
const MaterializeTemporaryExpr *Materialize
= cast<MaterializeTemporaryExpr>(S);
- if (!Materialize->getType()->isRecordType())
- CreateCXXTemporaryObject(Materialize, Pred, Dst);
+ if (Materialize->getType()->isRecordType())
+ Dst.Add(Pred);
else
- Visit(Materialize->GetTemporaryExpr(), Pred, Dst);
+ CreateCXXTemporaryObject(Materialize, Pred, Dst);
Bldr.addNodes(Dst);
break;
}
Modified: cfe/trunk/test/Analysis/nullptr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/nullptr.cpp?rev=152730&r1=152729&r2=152730&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/nullptr.cpp (original)
+++ cfe/trunk/test/Analysis/nullptr.cpp Wed Mar 14 13:01:43 2012
@@ -59,3 +59,25 @@
:"0"(*b) // expected-warning{{Dereference of null pointer}}
);
}
+
+int exprWithCleanups() {
+ struct S {
+ S(int a):a(a){}
+ ~S() {}
+
+ int a;
+ };
+
+ int *x = 0;
+ return S(*x).a; // expected-warning{{Dereference of null pointer}}
+}
+
+int materializeTempExpr() {
+ int *n = 0;
+ struct S {
+ int a;
+ S(int i): a(i) {}
+ };
+ const S &s = S(*n); // expected-warning{{Dereference of null pointer}}
+ return s.a;
+}
More information about the cfe-commits
mailing list