diff options
| author | Artem Dergachev <artem.dergachev@gmail.com> | 2017-10-10 11:55:56 +0000 |
|---|---|---|
| committer | Artem Dergachev <artem.dergachev@gmail.com> | 2017-10-10 11:55:56 +0000 |
| commit | 0f22a06b4de75d4d02741b9f39d39df1cd4e8066 (patch) | |
| tree | d963f1438e0928f58f40ca2f0c8bdc343e5c79fb | |
| parent | c06bb16f1c3f08817264e21da2e09d29adc45880 (diff) | |
| download | bcm5719-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
| -rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp | 9 | ||||
| -rw-r--r-- | clang/test/Analysis/MisusedMovedObject.cpp | 8 |
2 files changed, 16 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; } diff --git a/clang/test/Analysis/MisusedMovedObject.cpp b/clang/test/Analysis/MisusedMovedObject.cpp index 44e055fd407..57c1ecc912b 100644 --- a/clang/test/Analysis/MisusedMovedObject.cpp +++ b/clang/test/Analysis/MisusedMovedObject.cpp @@ -617,3 +617,11 @@ void subRegionMoveTest() { a.b.foo(); // no-warning } } + +class C: public A {}; +void resetSuperClass() { + C c; + C c1 = std::move(c); + c.clear(); + C c2 = c; // no-warning +} |

