diff options
| author | Gabor Horvath <xazax.hun@gmail.com> | 2018-10-09 07:28:57 +0000 |
|---|---|---|
| committer | Gabor Horvath <xazax.hun@gmail.com> | 2018-10-09 07:28:57 +0000 |
| commit | d1fd93ceea42ee13cbf711c93b3c5fe7757945d3 (patch) | |
| tree | 269f0b98839391e738c785d3f3cf83bb1040b0ca /clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp | |
| parent | 7ce9334ad784547be27844f9f1811fdedbc1f76f (diff) | |
| download | bcm5719-llvm-d1fd93ceea42ee13cbf711c93b3c5fe7757945d3.tar.gz bcm5719-llvm-d1fd93ceea42ee13cbf711c93b3c5fe7757945d3.zip | |
[analyzer] Support Reinitializes attribute in MisusedMovedObject check
Differential Revision: https://reviews.llvm.org/D52983
llvm-svn: 344017
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp')
| -rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp index 83037f04440..ab5f3a105f0 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp @@ -314,17 +314,18 @@ bool MisusedMovedObjectChecker::isMoveSafeMethod( return true; } // Function call `empty` can be skipped. - if (MethodDec && MethodDec->getDeclName().isIdentifier() && + return (MethodDec && MethodDec->getDeclName().isIdentifier() && (MethodDec->getName().lower() == "empty" || - MethodDec->getName().lower() == "isempty")) - return true; - - return false; + MethodDec->getName().lower() == "isempty")); } bool MisusedMovedObjectChecker::isStateResetMethod( const CXXMethodDecl *MethodDec) const { - if (MethodDec && MethodDec->getDeclName().isIdentifier()) { + if (!MethodDec) + return false; + if (MethodDec->hasAttr<ReinitializesAttr>()) + return true; + if (MethodDec->getDeclName().isIdentifier()) { std::string MethodName = MethodDec->getName().lower(); if (MethodName == "reset" || MethodName == "clear" || MethodName == "destroy") @@ -429,8 +430,7 @@ void MisusedMovedObjectChecker::checkPreCall(const CallEvent &Call, // We want to investigate the whole object, not only sub-object of a parent // class in which the encountered method defined. - while (const CXXBaseObjectRegion *BR = - dyn_cast<CXXBaseObjectRegion>(ThisRegion)) + while (const auto *BR = dyn_cast<CXXBaseObjectRegion>(ThisRegion)) ThisRegion = BR->getSuperRegion(); if (isMoveSafeMethod(MethodDecl)) @@ -487,13 +487,9 @@ ProgramStateRef MisusedMovedObjectChecker::checkRegionChanges( ThisRegion = IC->getCXXThisVal().getAsRegion(); } - for (ArrayRef<const MemRegion *>::iterator I = ExplicitRegions.begin(), - E = ExplicitRegions.end(); - I != E; ++I) { - const auto *Region = *I; - if (ThisRegion != Region) { + for (const auto *Region : ExplicitRegions) { + if (ThisRegion != Region) State = removeFromState(State, Region); - } } return State; |

