[PATCH] Enhance CFG to model C++ new more precisely
Jordan Rose
jordan_rose at apple.com
Thu Jan 2 09:47:34 PST 2014
I like that this actually isn't that complicated! Can you add some tests for new[], with placement args?
================
Comment at: include/clang/Analysis/CFG.h:148
@@ +147,3 @@
+public:
+ CFGNewAllocator(const CXXNewExpr *S)
+ : CFGElement(NewAllocator, S) {}
----------------
Nitpick: this should be marked `explicit`.
================
Comment at: include/clang/Analysis/CFG.h:57
@@ -55,2 +56,3 @@
Initializer,
+ NewAllocator,
// dtor kind
----------------
We're going to run out of Kinds some day. Can you put an assertion in the CFGElement constructor that the stored Kind is the same as the argument Kind?
================
Comment at: lib/Analysis/CFG.cpp:3140-3142
@@ +3139,5 @@
+ Block = VisitStmt(NE->getInitializer(), asc);
+ if (NE->isArray())
+ Block = VisitStmt(NE->getArraySize(), asc);
+ appendNewAllocator(Block, NE);
+ if (NE->getNumPlacementArgs() > 0) {
----------------
I think this is backwards, since the array size is used to determine the allocation size. We aren't likely to start using the array size right away, though.
================
Comment at: lib/Analysis/CFG.cpp:3143-3147
@@ +3142,7 @@
+ appendNewAllocator(Block, NE);
+ if (NE->getNumPlacementArgs() > 0) {
+ for (int i=0;i<NE->getNumPlacementArgs();++i) {
+ Block = VisitStmt(NE->getPlacementArg(i), asc);
+ }
+ }
+ return Block;
----------------
I think it's better to loop over placement_arg_begin/placement_arg_end. This code relies on the placement args being stored in a way that's efficient for random access...which is true today, but may not always be true.
Also, please include spaces after the semicolons in the loops.
================
Comment at: lib/StaticAnalyzer/Core/ExprEngine.cpp:556
@@ +555,3 @@
+ ExplodedNodeSet Dst;
+ VisitCXXNewAllocatorCall(NE,Pred,Dst);
+ Engine.enqueue(Dst, currBldrCtx->getBlock(), currStmtIdx);
----------------
Please insert spaces after the comma here.
================
Comment at: lib/StaticAnalyzer/Core/ExprEngineCXX.cpp:334
@@ +333,3 @@
+ ExplodedNodeSet &Dst) {
+ //TODO: Handle VisitCXXNewAllocatorExpr
+}
----------------
I would think the easiest way to skip the allocator would be `Dst.insert(Pred)` and leave it at that.
================
Comment at: lib/Analysis/CFG.cpp:3817
@@ -3792,1 +3816,3 @@
+ } else if (Optional<CFGNewAllocator> NE = E.getAs<CFGNewAllocator>()) {
+ OS << "CFGNewAllocator\n";
} else if (Optional<CFGDeleteDtor> DE = E.getAs<CFGDeleteDtor>()) {
----------------
Nitpick: we can do better. Maybe put the new-expression in parens, or at least the type being allocated?
http://llvm-reviews.chandlerc.com/D2423
More information about the cfe-commits
mailing list