[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 llvm-svn: 349328
This commit is contained in:
parent
2b500cbdf1
commit
ce42bd6765
|
@ -275,6 +275,9 @@ def NewDeleteLeaksChecker : Checker<"NewDeleteLeaks">,
|
|||
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<"MismatchedIterator">,
|
|||
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">;
|
||||
|
||||
|
|
|
@ -100,7 +100,7 @@ void good_move_find2(std::vector<int> &v1, std::vector<int> &v2, int n) {
|
|||
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, std::vector<int> &v2, int n) {
|
|||
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::vector<int> &v2) {
|
|||
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) {
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue