From f3f03662961820510b1deb9daaa61aec280c586e Mon Sep 17 00:00:00 2001 From: Artem Dergachev Date: Tue, 4 Dec 2018 03:38:08 +0000 Subject: [PATCH] [analyzer] MoveChecker: Add more common state resetting methods. Includes "resize" and "shrink" because they can reset the object to a known state in certain circumstances. Differential Revision: https://reviews.llvm.org/D54563 llvm-svn: 348235 --- clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp | 5 ++++- clang/test/Analysis/use-after-move.cpp | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp index d9ea0d9..c93ba9d 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp @@ -343,8 +343,11 @@ bool MoveChecker::isStateResetMethod(const CXXMethodDecl *MethodDec) const { return true; if (MethodDec->getDeclName().isIdentifier()) { std::string MethodName = MethodDec->getName().lower(); + // TODO: Some of these methods (eg., resize) are not always resetting + // the state, so we should consider looking at the arguments. if (MethodName == "reset" || MethodName == "clear" || - MethodName == "destroy") + MethodName == "destroy" || MethodName == "resize" || + MethodName == "shrink") return true; } return false; diff --git a/clang/test/Analysis/use-after-move.cpp b/clang/test/Analysis/use-after-move.cpp index 0e7f5d5..3134720e 100644 --- a/clang/test/Analysis/use-after-move.cpp +++ b/clang/test/Analysis/use-after-move.cpp @@ -15,6 +15,8 @@ namespace std { +typedef __typeof(sizeof(int)) size_t; + template struct remove_reference; @@ -110,6 +112,7 @@ public: void reset(); void destroy(); void clear(); + void resize(std::size_t); bool empty() const; bool isEmpty() const; operator bool() const; @@ -403,6 +406,13 @@ void moveStateResetFunctionsTest() { a.foo(); // no-warning a.b.foo(); // no-warning } + { + A a; + A b = std::move(a); + a.resize(0); // no-warning + a.foo(); // no-warning + a.b.foo(); // no-warning + } } // Moves or uses that occur as part of template arguments. -- 2.7.4