aboutsummaryrefslogtreecommitdiff
path: root/lib/StaticAnalyzer/Core/ProgramState.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/StaticAnalyzer/Core/ProgramState.cpp')
-rw-r--r--lib/StaticAnalyzer/Core/ProgramState.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/StaticAnalyzer/Core/ProgramState.cpp b/lib/StaticAnalyzer/Core/ProgramState.cpp
index 3b96cc899f..15662776d9 100644
--- a/lib/StaticAnalyzer/Core/ProgramState.cpp
+++ b/lib/StaticAnalyzer/Core/ProgramState.cpp
@@ -144,31 +144,41 @@ ProgramStateRef
ProgramState::invalidateRegions(ArrayRef<const MemRegion *> Regions,
const Expr *E, unsigned Count,
const LocationContext *LCtx,
- StoreManager::InvalidatedSymbols *IS,
+ bool ResultsInPointerEscape,
+ InvalidatedSymbols *IS,
const CallEvent *Call) const {
if (!IS) {
- StoreManager::InvalidatedSymbols invalidated;
+ InvalidatedSymbols invalidated;
return invalidateRegionsImpl(Regions, E, Count, LCtx,
+ ResultsInPointerEscape,
invalidated, Call);
}
- return invalidateRegionsImpl(Regions, E, Count, LCtx, *IS, Call);
+ return invalidateRegionsImpl(Regions, E, Count, LCtx, ResultsInPointerEscape,
+ *IS, Call);
}
ProgramStateRef
ProgramState::invalidateRegionsImpl(ArrayRef<const MemRegion *> Regions,
const Expr *E, unsigned Count,
const LocationContext *LCtx,
- StoreManager::InvalidatedSymbols &IS,
+ bool ResultsInPointerEscape,
+ InvalidatedSymbols &IS,
const CallEvent *Call) const {
ProgramStateManager &Mgr = getStateManager();
SubEngine* Eng = Mgr.getOwningEngine();
- if (Eng && Eng->wantsRegionChangeUpdate(this)) {
+ if (Eng) {
StoreManager::InvalidatedRegions Invalidated;
const StoreRef &newStore
= Mgr.StoreMgr->invalidateRegions(getStore(), Regions, E, Count, LCtx, IS,
Call, &Invalidated);
+
ProgramStateRef newState = makeWithStore(newStore);
+
+ if (ResultsInPointerEscape)
+ newState = Eng->processPointerEscapedOnInvalidateRegions(newState,
+ &IS, Regions, Invalidated, Call);
+
return Eng->processRegionChanges(newState, &IS, Regions, Invalidated, Call);
}