summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2017-10-10 11:55:56 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2017-10-10 11:55:56 +0000
commit0f22a06b4de75d4d02741b9f39d39df1cd4e8066 (patch)
treed963f1438e0928f58f40ca2f0c8bdc343e5c79fb /clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp
parentc06bb16f1c3f08817264e21da2e09d29adc45880 (diff)
downloadbcm5719-llvm-0f22a06b4de75d4d02741b9f39d39df1cd4e8066.tar.gz
bcm5719-llvm-0f22a06b4de75d4d02741b9f39d39df1cd4e8066.zip
[analyzer] MisusedMovedObject: Fix state-resetting a base-class sub-object.
If a method is resetting the state of an object that was moved from, it should be safe to use this object again. However if the method was defined in a parent class, but used in a child class, the reset didn't happen from the checker's perspective. Differential Revision: https://reviews.llvm.org/D31538 llvm-svn: 315301
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp')
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp
index 70da66dba47..4b69a1bd1ed 100644
--- a/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp
@@ -416,7 +416,14 @@ void MisusedMovedObjectChecker::checkPreCall(const CallEvent &Call,
return;
if (isStateResetMethod(MethodDecl)) {
- State = State->remove<TrackedRegionMap>(ThisRegion);
+ // A state reset method resets the whole object, not only sub-object
+ // of a parent class in which it is defined.
+ const MemRegion *WholeObjectRegion = ThisRegion;
+ while (const CXXBaseObjectRegion *BR =
+ dyn_cast<CXXBaseObjectRegion>(WholeObjectRegion))
+ WholeObjectRegion = BR->getSuperRegion();
+
+ State = State->remove<TrackedRegionMap>(WholeObjectRegion);
C.addTransition(State);
return;
}
OpenPOWER on IntegriCloud