diff options
| author | Jordan Rose <jordan_rose@apple.com> | 2014-02-11 02:21:06 +0000 |
|---|---|---|
| committer | Jordan Rose <jordan_rose@apple.com> | 2014-02-11 02:21:06 +0000 |
| commit | 8b808d64af8375d77a08d42520c97c7df8e9c3d0 (patch) | |
| tree | 304cf110d03b32dd50857fbb60870522bd8a80c9 /clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | |
| parent | 5a69dda9b0b080e0e82250e2ba0500c1423a9c5d (diff) | |
| download | bcm5719-llvm-8b808d64af8375d77a08d42520c97c7df8e9c3d0.tar.gz bcm5719-llvm-8b808d64af8375d77a08d42520c97c7df8e9c3d0.zip | |
[analyzer] Inline C++ operator new when c++-inline-allocators is turned on.
This will let us stage in the modeling of operator new. The -analyzer-config
opton 'c++-inline-allocators' is currently off by default.
Patch by Karthik Bhat!
llvm-svn: 201122
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/ExprEngine.cpp')
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index 095e09795da..ba5025b481c 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -553,12 +553,20 @@ void ExprEngine::ProcessImplicitDtor(const CFGImplicitDtor D, void ExprEngine::ProcessNewAllocator(const CXXNewExpr *NE, ExplodedNode *Pred) { - //TODO: Implement VisitCXXNewAllocatorCall ExplodedNodeSet Dst; - NodeBuilder Bldr(Pred, Dst, *currBldrCtx); - const LocationContext *LCtx = Pred->getLocationContext(); - PostImplicitCall PP(NE->getOperatorNew(), NE->getLocStart(), LCtx); - Bldr.generateNode(PP, Pred->getState(), Pred); + AnalysisManager &AMgr = getAnalysisManager(); + AnalyzerOptions &Opts = AMgr.options; + // TODO: We're not evaluating allocators for all cases just yet as + // we're not handling the return value correctly, which causes false + // positives when the alpha.cplusplus.NewDeleteLeaks check is on. + if (Opts.mayInlineCXXAllocator()) + VisitCXXNewAllocatorCall(NE, Pred, Dst); + else { + NodeBuilder Bldr(Pred, Dst, *currBldrCtx); + const LocationContext *LCtx = Pred->getLocationContext(); + PostImplicitCall PP(NE->getOperatorNew(), NE->getLocStart(), LCtx); + Bldr.generateNode(PP, Pred->getState(), Pred); + } Engine.enqueue(Dst, currBldrCtx->getBlock(), currStmtIdx); } |

