r178160 - [analyzer] Use evalBind for C++ new of scalar types.
Jordan Rose
jordan_rose at apple.com
Wed Mar 27 11:10:35 PDT 2013
Author: jrose
Date: Wed Mar 27 13:10:35 2013
New Revision: 178160
URL: http://llvm.org/viewvc/llvm-project?rev=178160&view=rev
Log:
[analyzer] Use evalBind for C++ new of scalar types.
These types will not have a CXXConstructExpr to do the initialization for
them. Previously we just used a simple call to ProgramState::bindLoc, but
that doesn't trigger proper checker callbacks (like pointer escape).
Found by Anton Yartsev.
Modified:
cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
cfe/trunk/test/Analysis/new.cpp
Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp?rev=178160&r1=178159&r2=178160&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp Wed Mar 27 13:10:35 2013
@@ -331,20 +331,23 @@ void ExprEngine::VisitCXXNewExpr(const C
State = State->BindExpr(CNE, LCtx, symVal);
}
+ Bldr.generateNode(CNE, Pred, State);
+
// If the type is not a record, we won't have a CXXConstructExpr as an
// initializer. Copy the value over.
if (const Expr *Init = CNE->getInitializer()) {
if (!isa<CXXConstructExpr>(Init)) {
- QualType ObjTy = CNE->getType()->getAs<PointerType>()->getPointeeType();
- (void)ObjTy;
- assert(!ObjTy->isRecordType());
+ assert(Bldr.getResults().size() == 1);
+ ExplodedNode *TmpN = *Bldr.getResults().begin();
+ Bldr.takeNodes(TmpN);
+
+ assert(!CNE->getType()->getPointeeCXXRecordDecl());
+
SVal Location = State->getSVal(CNE, LCtx);
- if (Optional<Loc> LV = Location.getAs<Loc>())
- State = State->bindLoc(*LV, State->getSVal(Init, LCtx));
+ bool FirstInit = (Location == symVal);
+ evalBind(Dst, CNE, TmpN, Location, State->getSVal(Init, LCtx), FirstInit);
}
}
-
- Bldr.generateNode(CNE, Pred, State);
}
void ExprEngine::VisitCXXDeleteExpr(const CXXDeleteExpr *CDE,
Modified: cfe/trunk/test/Analysis/new.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/new.cpp?rev=178160&r1=178159&r2=178160&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/new.cpp (original)
+++ cfe/trunk/test/Analysis/new.cpp Wed Mar 27 13:10:35 2013
@@ -76,7 +76,22 @@ struct PtrWrapper {
PtrWrapper *testNewInvalidation() {
// Ensure that we don't consider this a leak.
- return new PtrWrapper(static_cast<int *>(malloc(4)));
+ return new PtrWrapper(static_cast<int *>(malloc(4))); // no-warning
+}
+
+void testNewInvalidationPlacement(PtrWrapper *w) {
+ // Ensure that we don't consider this a leak.
+ new (w) PtrWrapper(static_cast<int *>(malloc(4))); // no-warning
+}
+
+int **testNewInvalidationScalar() {
+ // Ensure that we don't consider this a leak.
+ return new (int *)(static_cast<int *>(malloc(4))); // no-warning
+}
+
+void testNewInvalidationScalarPlacement(int **p) {
+ // Ensure that we don't consider this a leak.
+ new (p) (int *)(static_cast<int *>(malloc(4))); // no-warning
}
//--------------------------------------------------------------------
More information about the cfe-commits
mailing list