Author: dergachev Date: Sun Dec 16 22:30:39 2018 New Revision: 349328 URL: http://llvm.org/viewvc/llvm-project?rev=349328&view=rev Log: [analyzer] MoveChecker: Enable by default as cplusplus.Move.
This checker warns you when you re-use an object after moving it. Mostly developed by Peter Szecsi! Differential Revision: https://reviews.llvm.org/D38675 Modified: cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td cfe/trunk/test/Analysis/mismatched-iterator.cpp cfe/trunk/test/Analysis/use-after-move.cpp Modified: cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td?rev=349328&r1=349327&r2=349328&view=diff ============================================================================== --- cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td (original) +++ cfe/trunk/include/clang/StaticAnalyzer/Checkers/Checkers.td Sun Dec 16 22:30:39 2018 @@ -275,6 +275,9 @@ def NewDeleteLeaksChecker : Checker<"New def CXXSelfAssignmentChecker : Checker<"SelfAssignment">, HelpText<"Checks C++ copy and move assignment operators for self assignment">; +def MoveChecker: Checker<"Move">, + HelpText<"Find use-after-move bugs in C++">; + } // end: "cplusplus" let ParentPackage = CplusplusOptIn in { @@ -303,9 +306,6 @@ def MismatchedIteratorChecker : Checker< HelpText<"Check for use of iterators of different containers where iterators " "of the same container are expected">; -def MoveChecker: Checker<"Move">, - HelpText<"Find use-after-move bugs in C++">; - def UninitializedObjectChecker: Checker<"UninitializedObject">, HelpText<"Reports uninitialized fields after object construction">; Modified: cfe/trunk/test/Analysis/mismatched-iterator.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/mismatched-iterator.cpp?rev=349328&r1=349327&r2=349328&view=diff ============================================================================== --- cfe/trunk/test/Analysis/mismatched-iterator.cpp (original) +++ cfe/trunk/test/Analysis/mismatched-iterator.cpp Sun Dec 16 22:30:39 2018 @@ -100,7 +100,7 @@ void good_move_find2(std::vector<int> &v void good_move_find3(std::vector<int> &v1, std::vector<int> &v2, int n) { auto i0 = v2.cend(); v1 = std::move(v2); - v2.push_back(n); + v2.push_back(n); // expected-warning{{Method called on moved-from object of type 'std::vector'}} std::find(v2.cbegin(), i0, n); // no-warning } @@ -125,6 +125,7 @@ void bad_move_find1(std::vector<int> &v1 auto i0 = v2.cbegin(); v1 = std::move(v2); std::find(i0, v2.cend(), n); // expected-warning{{Iterators of different containers used where the same container is expected}} + // expected-warning@-1{{Method called on moved-from object of type 'std::vector'}} } void bad_insert_find(std::vector<int> &v1, std::vector<int> &v2, int n, int m) { @@ -167,12 +168,14 @@ void bad_move(std::vector<int> &v1, std: const auto i0 = ++v2.cbegin(); v1 = std::move(v2); v2.erase(i0); // expected-warning{{Container accessed using foreign iterator argument}} + // expected-warning@-1{{Method called on moved-from object of type 'std::vector'}} } void bad_move_find2(std::vector<int> &v1, std::vector<int> &v2, int n) { auto i0 = --v2.cend(); v1 = std::move(v2); std::find(i0, v2.cend(), n); // expected-warning{{Iterators of different containers used where the same container is expected}} + // expected-warning@-1{{Method called on moved-from object of type 'std::vector'}} } void bad_move_find3(std::vector<int> &v1, std::vector<int> &v2, int n) { Modified: cfe/trunk/test/Analysis/use-after-move.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/use-after-move.cpp?rev=349328&r1=349327&r2=349328&view=diff ============================================================================== --- cfe/trunk/test/Analysis/use-after-move.cpp (original) +++ cfe/trunk/test/Analysis/use-after-move.cpp Sun Dec 16 22:30:39 2018 @@ -1,30 +1,30 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.cplusplus.Move -verify %s\ +// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.Move -verify %s\ // RUN: -std=c++11 -analyzer-output=text -analyzer-config eagerly-assume=false\ // RUN: -analyzer-config exploration_strategy=unexplored_first_queue\ // RUN: -analyzer-checker debug.ExprInspection -// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.cplusplus.Move -verify %s\ +// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.Move -verify %s\ // RUN: -std=c++11 -analyzer-output=text -analyzer-config eagerly-assume=false\ // RUN: -analyzer-config exploration_strategy=dfs -DDFS=1\ // RUN: -analyzer-checker debug.ExprInspection -// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.cplusplus.Move -verify %s\ +// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.Move -verify %s\ // RUN: -std=c++11 -analyzer-output=text -analyzer-config eagerly-assume=false\ // RUN: -analyzer-config exploration_strategy=unexplored_first_queue\ -// RUN: -analyzer-config alpha.cplusplus.Move:WarnOn=KnownsOnly -DPEACEFUL\ +// RUN: -analyzer-config cplusplus.Move:WarnOn=KnownsOnly -DPEACEFUL\ // RUN: -analyzer-checker debug.ExprInspection -// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.cplusplus.Move -verify %s\ +// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.Move -verify %s\ // RUN: -std=c++11 -analyzer-output=text -analyzer-config eagerly-assume=false\ // RUN: -analyzer-config exploration_strategy=dfs -DDFS=1\ -// RUN: -analyzer-config alpha.cplusplus.Move:WarnOn=KnownsOnly -DPEACEFUL\ +// RUN: -analyzer-config cplusplus.Move:WarnOn=KnownsOnly -DPEACEFUL\ // RUN: -analyzer-checker debug.ExprInspection -// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.cplusplus.Move -verify %s\ +// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.Move -verify %s\ // RUN: -std=c++11 -analyzer-output=text -analyzer-config eagerly-assume=false\ // RUN: -analyzer-config exploration_strategy=unexplored_first_queue\ -// RUN: -analyzer-config alpha.cplusplus.Move:WarnOn=All -DAGGRESSIVE\ +// RUN: -analyzer-config cplusplus.Move:WarnOn=All -DAGGRESSIVE\ // RUN: -analyzer-checker debug.ExprInspection -// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.cplusplus.Move -verify %s\ +// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.Move -verify %s\ // RUN: -std=c++11 -analyzer-output=text -analyzer-config eagerly-assume=false\ // RUN: -analyzer-config exploration_strategy=dfs -DDFS=1\ -// RUN: -analyzer-config alpha.cplusplus.Move:WarnOn=All -DAGGRESSIVE\ +// RUN: -analyzer-config cplusplus.Move:WarnOn=All -DAGGRESSIVE\ // RUN: -analyzer-checker debug.ExprInspection #include "Inputs/system-header-simulator-cxx.h" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits