tdl-g created this revision.
tdl-g added a reviewer: ymandel.
Herald added subscribers: cfe-commits, phosek, Charusso, mgorny.
Herald added a project: clang.
Eugene.Zelenko edited reviewers, added: alexfh, hokein, aaron.ballman,
njames93; removed: ymandel.
Eugene.Zelenko added a project: clang-tools-extra.
Eugene.Zelenko retitled this revision from "Add abseil-string-find-str-contains
checker." to "[clang-tidy] Add abseil-string-find-str-contains checker.".
Herald added a subscriber: xazax.hun.
This adds a checker which suggests replacing string.find(...) == npos with
absl::StrContains.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D80023
Files:
clang-tools-extra/clang-tidy/abseil/AbseilTidyModule.cpp
clang-tools-extra/clang-tidy/abseil/CMakeLists.txt
clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp
clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.h
clang-tools-extra/docs/ReleaseNotes.rst
clang-tools-extra/docs/clang-tidy/checks/abseil-string-find-str-contains.rst
clang-tools-extra/docs/clang-tidy/checks/list.rst
clang-tools-extra/test/clang-tidy/checkers/abseil-string-find-str-contains.cpp
Index: clang-tools-extra/test/clang-tidy/checkers/abseil-string-find-str-contains.cpp
===================================================================
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/abseil-string-find-str-contains.cpp
@@ -0,0 +1,283 @@
+// RUN: %check_clang_tidy %s abseil-string-find-str-contains %t -- \
+// RUN: -config="{CheckOptions: []}"
+
+using size_t = decltype(sizeof(int));
+
+namespace std {
+
+// Lightweight standin for std::string.
+template <typename C>
+class basic_string {
+public:
+ basic_string();
+ basic_string(const basic_string &);
+ basic_string(const C *);
+ ~basic_string();
+ int find(basic_string s, int pos = 0);
+ int find(const C *s, int pos = 0);
+ int find(char c, int pos = 0);
+ static constexpr size_t npos = -1;
+};
+typedef basic_string<char> string;
+
+// Lightweight standin for std::string_view.
+template <typename C>
+class basic_string_view {
+public:
+ basic_string_view();
+ basic_string_view(const basic_string_view &);
+ basic_string_view(const C *);
+ ~basic_string_view();
+ int find(basic_string_view s, int pos = 0);
+ int find(const C *s, int pos = 0);
+ int find(char c, int pos = 0);
+ static constexpr size_t npos = -1;
+};
+typedef basic_string_view<char> string_view;
+
+} // namespace std
+
+namespace absl {
+
+// Lightweight standin for absl::string_view.
+class string_view {
+public:
+ string_view();
+ string_view(const string_view &);
+ string_view(const char *);
+ ~string_view();
+ int find(string_view s, int pos = 0);
+ int find(const char *s, int pos = 0);
+ int find(char c, int pos = 0);
+ static constexpr size_t npos = -1;
+};
+
+} // namespace absl
+
+// Functions that take and return our various string-like types.
+std::string foo_ss(std::string);
+std::string_view foo_ssv(std::string_view);
+absl::string_view foo_asv(absl::string_view);
+std::string bar_ss();
+std::string_view bar_ssv();
+absl::string_view bar_asv();
+
+// Confirms that find==npos and find!=npos work for each supported type, when
+// npos comes from the correct type.
+void basic_tests() {
+ std::string ss;
+ ss.find("a") == std::string::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of find() == npos
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(ss, "a");{{$}}
+
+ ss.find("a") != std::string::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of find() != npos
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(ss, "a");{{$}}
+
+ std::string::npos != ss.find("a");
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(ss, "a");{{$}}
+
+ std::string_view ssv;
+ ssv.find("a") == std::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(ssv, "a");{{$}}
+
+ ssv.find("a") != std::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(ssv, "a");{{$}}
+
+ std::string_view::npos != ssv.find("a");
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(ssv, "a");{{$}}
+
+ absl::string_view asv;
+ asv.find("a") == absl::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(asv, "a");{{$}}
+
+ asv.find("a") != absl::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(asv, "a");{{$}}
+
+ absl::string_view::npos != asv.find("a");
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(asv, "a");{{$}}
+}
+
+// Confirms that it works even if you mix-and-match the type for find and for
+// npos. (One of the reasons for this checker is to clean up cases that
+// accidentally mix-and-match like this. absl::StrContains is less
+// error-prone.)
+void mismatched_npos() {
+ std::string ss;
+ ss.find("a") == std::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(ss, "a");{{$}}
+
+ ss.find("a") != absl::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(ss, "a");{{$}}
+
+ std::string_view ssv;
+ ssv.find("a") == absl::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(ssv, "a");{{$}}
+
+ ssv.find("a") != std::string::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(ssv, "a");{{$}}
+
+ absl::string_view asv;
+ asv.find("a") == std::string::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(asv, "a");{{$}}
+
+ asv.find("a") != std::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(asv, "a");{{$}}
+}
+
+// Confirms that it works even when the needle or the haystack are more
+// complicated expressions.
+void subexpression_tests() {
+ std::string ss, ss2;
+ foo_ss(ss).find(ss2) == std::string::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(foo_ss(ss), ss2);{{$}}
+
+ ss.find(foo_ss(ss2)) != std::string::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(ss, foo_ss(ss2));{{$}}
+
+ foo_ss(bar_ss()).find(foo_ss(ss2)) != std::string::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(foo_ss(bar_ss()), foo_ss(ss2));{{$}}
+
+ std::string_view ssv, ssv2;
+ foo_ssv(ssv).find(ssv2) == std::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(foo_ssv(ssv), ssv2);{{$}}
+
+ ssv.find(foo_ssv(ssv2)) != std::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(ssv, foo_ssv(ssv2));{{$}}
+
+ foo_ssv(bar_ssv()).find(foo_ssv(ssv2)) != std::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(foo_ssv(bar_ssv()), foo_ssv(ssv2));{{$}}
+
+ absl::string_view asv, asv2;
+ foo_asv(asv).find(asv2) == absl::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(foo_asv(asv), asv2);{{$}}
+
+ asv.find(foo_asv(asv2)) != absl::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(asv, foo_asv(asv2));{{$}}
+
+ foo_asv(bar_asv()).find(foo_asv(asv2)) != absl::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}absl::StrContains(foo_asv(bar_asv()), foo_asv(asv2));{{$}}
+}
+
+// Confirms that it works with string literal, char* and const char* parameters.
+void string_literal_and_char_ptr_tests() {
+ char *c = nullptr;
+ const char *cc = nullptr;
+
+ std::string ss;
+ ss.find("c") == std::string::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(ss, "c");{{$}}
+
+ ss.find(c) == std::string::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(ss, c);{{$}}
+
+ ss.find(cc) == std::string::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(ss, cc);{{$}}
+
+ std::string_view ssv;
+ ssv.find("c") == std::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(ssv, "c");{{$}}
+
+ ssv.find(c) == std::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(ssv, c);{{$}}
+
+ ssv.find(cc) == std::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(ssv, cc);{{$}}
+
+ absl::string_view asv;
+ asv.find("c") == absl::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(asv, "c");{{$}}
+
+ asv.find(c) == absl::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(asv, c);{{$}}
+
+ asv.find(cc) == absl::string_view::npos;
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: use !absl::StrContains instead of
+ // CHECK-FIXES: {{^[[:space:]]*}}!absl::StrContains(asv, cc);{{$}}
+}
+
+// Confirms that it does *not* match when the parameter to find() is a char,
+// because absl::StrContains is not implemented for char.
+void no_char_param_tests() {
+ std::string ss;
+ ss.find('c') == std::string::npos;
+
+ std::string_view ssv;
+ ssv.find('c') == std::string_view::npos;
+
+ absl::string_view asv;
+ asv.find('c') == absl::string_view::npos;
+}
+
+#define COMPARE_MACRO(x, y) ((x) == (y))
+#define FIND_MACRO(x, y) ((x).find(y))
+#define FIND_COMPARE_MACRO(x, y, z) ((x).find(y) == (z))
+
+// Confirms that it does not match when a macro is involved.
+void no_macros() {
+ std::string s;
+ COMPARE_MACRO(s.find("a"), std::string::npos);
+ FIND_MACRO(s, "a") == std::string::npos;
+ FIND_COMPARE_MACRO(s, "a", std::string::npos);
+}
+
+// Confirms that it does not match when the pos parameter is non-zero.
+void no_nonzero_pos() {
+ std::string ss;
+ ss.find("a", 1) == std::string::npos;
+
+ std::string_view ssv;
+ ssv.find("a", 2) == std::string_view::npos;
+
+ absl::string_view asv;
+ asv.find("a", 3) == std::string_view::npos;
+}
+
+// Confirms that it does not match when it's compared to something other than
+// npos, even if the value is the same as npos.
+void no_non_npos() {
+ std::string ss;
+ ss.find("a") == 0;
+ ss.find("a") == 1;
+ ss.find("a") == -1;
+
+ std::string_view ssv;
+ ssv.find("a") == 0;
+ ssv.find("a") == 1;
+ ssv.find("a") == -1;
+
+ absl::string_view asv;
+ asv.find("a") == 0;
+ asv.find("a") == 1;
+ asv.find("a") == -1;
+}
Index: clang-tools-extra/docs/clang-tidy/checks/list.rst
===================================================================
--- clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -12,27 +12,28 @@
.. csv-table::
:header: "Name", "Offers fixes"
- `abseil-duration-addition <abseil-duration-addition.html>`_, "Yes"
- `abseil-duration-comparison <abseil-duration-comparison.html>`_, "Yes"
- `abseil-duration-conversion-cast <abseil-duration-conversion-cast.html>`_, "Yes"
- `abseil-duration-division <abseil-duration-division.html>`_, "Yes"
- `abseil-duration-factory-float <abseil-duration-factory-float.html>`_, "Yes"
- `abseil-duration-factory-scale <abseil-duration-factory-scale.html>`_, "Yes"
- `abseil-duration-subtraction <abseil-duration-subtraction.html>`_, "Yes"
- `abseil-duration-unnecessary-conversion <abseil-duration-unnecessary-conversion.html>`_, "Yes"
- `abseil-faster-strsplit-delimiter <abseil-faster-strsplit-delimiter.html>`_, "Yes"
+ `abseil-duration-addition <abseil-duration-addition.html>`_,
+ `abseil-duration-comparison <abseil-duration-comparison.html>`_,
+ `abseil-duration-conversion-cast <abseil-duration-conversion-cast.html>`_,
+ `abseil-duration-division <abseil-duration-division.html>`_,
+ `abseil-duration-factory-float <abseil-duration-factory-float.html>`_,
+ `abseil-duration-factory-scale <abseil-duration-factory-scale.html>`_,
+ `abseil-duration-subtraction <abseil-duration-subtraction.html>`_,
+ `abseil-duration-unnecessary-conversion <abseil-duration-unnecessary-conversion.html>`_,
+ `abseil-faster-strsplit-delimiter <abseil-faster-strsplit-delimiter.html>`_,
`abseil-no-internal-dependencies <abseil-no-internal-dependencies.html>`_,
`abseil-no-namespace <abseil-no-namespace.html>`_,
- `abseil-redundant-strcat-calls <abseil-redundant-strcat-calls.html>`_, "Yes"
- `abseil-str-cat-append <abseil-str-cat-append.html>`_, "Yes"
- `abseil-string-find-startswith <abseil-string-find-startswith.html>`_, "Yes"
- `abseil-time-comparison <abseil-time-comparison.html>`_, "Yes"
- `abseil-time-subtraction <abseil-time-subtraction.html>`_, "Yes"
- `abseil-upgrade-duration-conversions <abseil-upgrade-duration-conversions.html>`_, "Yes"
- `android-cloexec-accept <android-cloexec-accept.html>`_, "Yes"
+ `abseil-redundant-strcat-calls <abseil-redundant-strcat-calls.html>`_,
+ `abseil-str-cat-append <abseil-str-cat-append.html>`_,
+ `abseil-string-find-startswith <abseil-string-find-startswith.html>`_,
+ `abseil-string-find-str-contains <abseil-string-find-str-contains.html>`_,
+ `abseil-time-comparison <abseil-time-comparison.html>`_,
+ `abseil-time-subtraction <abseil-time-subtraction.html>`_,
+ `abseil-upgrade-duration-conversions <abseil-upgrade-duration-conversions.html>`_,
+ `android-cloexec-accept <android-cloexec-accept.html>`_,
`android-cloexec-accept4 <android-cloexec-accept4.html>`_,
- `android-cloexec-creat <android-cloexec-creat.html>`_, "Yes"
- `android-cloexec-dup <android-cloexec-dup.html>`_, "Yes"
+ `android-cloexec-creat <android-cloexec-creat.html>`_,
+ `android-cloexec-dup <android-cloexec-dup.html>`_,
`android-cloexec-epoll-create <android-cloexec-epoll-create.html>`_,
`android-cloexec-epoll-create1 <android-cloexec-epoll-create1.html>`_,
`android-cloexec-fopen <android-cloexec-fopen.html>`_,
@@ -40,63 +41,63 @@
`android-cloexec-inotify-init1 <android-cloexec-inotify-init1.html>`_,
`android-cloexec-memfd-create <android-cloexec-memfd-create.html>`_,
`android-cloexec-open <android-cloexec-open.html>`_,
- `android-cloexec-pipe <android-cloexec-pipe.html>`_, "Yes"
+ `android-cloexec-pipe <android-cloexec-pipe.html>`_,
`android-cloexec-pipe2 <android-cloexec-pipe2.html>`_,
`android-cloexec-socket <android-cloexec-socket.html>`_,
`android-comparison-in-temp-failure-retry <android-comparison-in-temp-failure-retry.html>`_,
- `boost-use-to-string <boost-use-to-string.html>`_, "Yes"
- `bugprone-argument-comment <bugprone-argument-comment.html>`_, "Yes"
+ `boost-use-to-string <boost-use-to-string.html>`_,
+ `bugprone-argument-comment <bugprone-argument-comment.html>`_,
`bugprone-assert-side-effect <bugprone-assert-side-effect.html>`_,
`bugprone-bad-signal-to-kill-thread <bugprone-bad-signal-to-kill-thread.html>`_,
- `bugprone-bool-pointer-implicit-conversion <bugprone-bool-pointer-implicit-conversion.html>`_, "Yes"
+ `bugprone-bool-pointer-implicit-conversion <bugprone-bool-pointer-implicit-conversion.html>`_,
`bugprone-branch-clone <bugprone-branch-clone.html>`_,
- `bugprone-copy-constructor-init <bugprone-copy-constructor-init.html>`_, "Yes"
+ `bugprone-copy-constructor-init <bugprone-copy-constructor-init.html>`_,
`bugprone-dangling-handle <bugprone-dangling-handle.html>`_,
`bugprone-dynamic-static-initializers <bugprone-dynamic-static-initializers.html>`_,
`bugprone-exception-escape <bugprone-exception-escape.html>`_,
`bugprone-fold-init-type <bugprone-fold-init-type.html>`_,
`bugprone-forward-declaration-namespace <bugprone-forward-declaration-namespace.html>`_,
`bugprone-forwarding-reference-overload <bugprone-forwarding-reference-overload.html>`_,
- `bugprone-inaccurate-erase <bugprone-inaccurate-erase.html>`_, "Yes"
+ `bugprone-inaccurate-erase <bugprone-inaccurate-erase.html>`_,
`bugprone-incorrect-roundings <bugprone-incorrect-roundings.html>`_,
`bugprone-infinite-loop <bugprone-infinite-loop.html>`_,
`bugprone-integer-division <bugprone-integer-division.html>`_,
`bugprone-lambda-function-name <bugprone-lambda-function-name.html>`_,
- `bugprone-macro-parentheses <bugprone-macro-parentheses.html>`_, "Yes"
+ `bugprone-macro-parentheses <bugprone-macro-parentheses.html>`_,
`bugprone-macro-repeated-side-effects <bugprone-macro-repeated-side-effects.html>`_,
- `bugprone-misplaced-operator-in-strlen-in-alloc <bugprone-misplaced-operator-in-strlen-in-alloc.html>`_, "Yes"
- `bugprone-misplaced-pointer-arithmetic-in-alloc <bugprone-misplaced-pointer-arithmetic-in-alloc.html>`_, "Yes"
+ `bugprone-misplaced-operator-in-strlen-in-alloc <bugprone-misplaced-operator-in-strlen-in-alloc.html>`_,
+ `bugprone-misplaced-pointer-arithmetic-in-alloc <bugprone-misplaced-pointer-arithmetic-in-alloc.html>`_,
`bugprone-misplaced-widening-cast <bugprone-misplaced-widening-cast.html>`_,
- `bugprone-move-forwarding-reference <bugprone-move-forwarding-reference.html>`_, "Yes"
+ `bugprone-move-forwarding-reference <bugprone-move-forwarding-reference.html>`_,
`bugprone-multiple-statement-macro <bugprone-multiple-statement-macro.html>`_,
- `bugprone-not-null-terminated-result <bugprone-not-null-terminated-result.html>`_, "Yes"
- `bugprone-parent-virtual-call <bugprone-parent-virtual-call.html>`_, "Yes"
- `bugprone-posix-return <bugprone-posix-return.html>`_, "Yes"
- `bugprone-reserved-identifier <bugprone-reserved-identifier.html>`_, "Yes"
+ `bugprone-not-null-terminated-result <bugprone-not-null-terminated-result.html>`_,
+ `bugprone-parent-virtual-call <bugprone-parent-virtual-call.html>`_,
+ `bugprone-posix-return <bugprone-posix-return.html>`_,
+ `bugprone-reserved-identifier <bugprone-reserved-identifier.html>`_,
`bugprone-signed-char-misuse <bugprone-signed-char-misuse.html>`_,
`bugprone-sizeof-container <bugprone-sizeof-container.html>`_,
`bugprone-sizeof-expression <bugprone-sizeof-expression.html>`_,
`bugprone-spuriously-wake-up-functions <bugprone-spuriously-wake-up-functions.html>`_,
- `bugprone-string-constructor <bugprone-string-constructor.html>`_, "Yes"
- `bugprone-string-integer-assignment <bugprone-string-integer-assignment.html>`_, "Yes"
+ `bugprone-string-constructor <bugprone-string-constructor.html>`_,
+ `bugprone-string-integer-assignment <bugprone-string-integer-assignment.html>`_,
`bugprone-string-literal-with-embedded-nul <bugprone-string-literal-with-embedded-nul.html>`_,
`bugprone-suspicious-enum-usage <bugprone-suspicious-enum-usage.html>`_,
`bugprone-suspicious-include <bugprone-suspicious-include.html>`_,
- `bugprone-suspicious-memset-usage <bugprone-suspicious-memset-usage.html>`_, "Yes"
+ `bugprone-suspicious-memset-usage <bugprone-suspicious-memset-usage.html>`_,
`bugprone-suspicious-missing-comma <bugprone-suspicious-missing-comma.html>`_,
- `bugprone-suspicious-semicolon <bugprone-suspicious-semicolon.html>`_, "Yes"
- `bugprone-suspicious-string-compare <bugprone-suspicious-string-compare.html>`_, "Yes"
- `bugprone-swapped-arguments <bugprone-swapped-arguments.html>`_, "Yes"
- `bugprone-terminating-continue <bugprone-terminating-continue.html>`_, "Yes"
+ `bugprone-suspicious-semicolon <bugprone-suspicious-semicolon.html>`_,
+ `bugprone-suspicious-string-compare <bugprone-suspicious-string-compare.html>`_,
+ `bugprone-swapped-arguments <bugprone-swapped-arguments.html>`_,
+ `bugprone-terminating-continue <bugprone-terminating-continue.html>`_,
`bugprone-throw-keyword-missing <bugprone-throw-keyword-missing.html>`_,
`bugprone-too-small-loop-variable <bugprone-too-small-loop-variable.html>`_,
`bugprone-undefined-memory-manipulation <bugprone-undefined-memory-manipulation.html>`_,
`bugprone-undelegated-constructor <bugprone-undelegated-constructor.html>`_,
`bugprone-unhandled-self-assignment <bugprone-unhandled-self-assignment.html>`_,
- `bugprone-unused-raii <bugprone-unused-raii.html>`_, "Yes"
+ `bugprone-unused-raii <bugprone-unused-raii.html>`_,
`bugprone-unused-return-value <bugprone-unused-return-value.html>`_,
`bugprone-use-after-move <bugprone-use-after-move.html>`_,
- `bugprone-virtual-near-miss <bugprone-virtual-near-miss.html>`_, "Yes"
+ `bugprone-virtual-near-miss <bugprone-virtual-near-miss.html>`_,
`cert-dcl21-cpp <cert-dcl21-cpp.html>`_,
`cert-dcl50-cpp <cert-dcl50-cpp.html>`_,
`cert-dcl58-cpp <cert-dcl58-cpp.html>`_,
@@ -132,28 +133,29 @@
`clang-analyzer-valist.Uninitialized <clang-analyzer-valist.Uninitialized.html>`_,
`clang-analyzer-valist.Unterminated <clang-analyzer-valist.Unterminated.html>`_,
`cppcoreguidelines-avoid-goto <cppcoreguidelines-avoid-goto.html>`_,
- `cppcoreguidelines-init-variables <cppcoreguidelines-init-variables.html>`_, "Yes"
+ `cppcoreguidelines-avoid-non-const-global-variables <cppcoreguidelines-avoid-non-const-global-variables.html>`_,
+ `cppcoreguidelines-init-variables <cppcoreguidelines-init-variables.html>`_,
`cppcoreguidelines-interfaces-global-init <cppcoreguidelines-interfaces-global-init.html>`_,
`cppcoreguidelines-macro-usage <cppcoreguidelines-macro-usage.html>`_,
`cppcoreguidelines-narrowing-conversions <cppcoreguidelines-narrowing-conversions.html>`_,
`cppcoreguidelines-no-malloc <cppcoreguidelines-no-malloc.html>`_,
`cppcoreguidelines-owning-memory <cppcoreguidelines-owning-memory.html>`_,
`cppcoreguidelines-pro-bounds-array-to-pointer-decay <cppcoreguidelines-pro-bounds-array-to-pointer-decay.html>`_,
- `cppcoreguidelines-pro-bounds-constant-array-index <cppcoreguidelines-pro-bounds-constant-array-index.html>`_, "Yes"
+ `cppcoreguidelines-pro-bounds-constant-array-index <cppcoreguidelines-pro-bounds-constant-array-index.html>`_,
`cppcoreguidelines-pro-bounds-pointer-arithmetic <cppcoreguidelines-pro-bounds-pointer-arithmetic.html>`_,
`cppcoreguidelines-pro-type-const-cast <cppcoreguidelines-pro-type-const-cast.html>`_,
- `cppcoreguidelines-pro-type-cstyle-cast <cppcoreguidelines-pro-type-cstyle-cast.html>`_, "Yes"
- `cppcoreguidelines-pro-type-member-init <cppcoreguidelines-pro-type-member-init.html>`_, "Yes"
+ `cppcoreguidelines-pro-type-cstyle-cast <cppcoreguidelines-pro-type-cstyle-cast.html>`_,
+ `cppcoreguidelines-pro-type-member-init <cppcoreguidelines-pro-type-member-init.html>`_,
`cppcoreguidelines-pro-type-reinterpret-cast <cppcoreguidelines-pro-type-reinterpret-cast.html>`_,
- `cppcoreguidelines-pro-type-static-cast-downcast <cppcoreguidelines-pro-type-static-cast-downcast.html>`_, "Yes"
+ `cppcoreguidelines-pro-type-static-cast-downcast <cppcoreguidelines-pro-type-static-cast-downcast.html>`_,
`cppcoreguidelines-pro-type-union-access <cppcoreguidelines-pro-type-union-access.html>`_,
`cppcoreguidelines-pro-type-vararg <cppcoreguidelines-pro-type-vararg.html>`_,
`cppcoreguidelines-slicing <cppcoreguidelines-slicing.html>`_,
`cppcoreguidelines-special-member-functions <cppcoreguidelines-special-member-functions.html>`_,
`darwin-avoid-spinlock <darwin-avoid-spinlock.html>`_,
- `darwin-dispatch-once-nonstatic <darwin-dispatch-once-nonstatic.html>`_, "Yes"
+ `darwin-dispatch-once-nonstatic <darwin-dispatch-once-nonstatic.html>`_,
`fuchsia-default-arguments-calls <fuchsia-default-arguments-calls.html>`_,
- `fuchsia-default-arguments-declarations <fuchsia-default-arguments-declarations.html>`_, "Yes"
+ `fuchsia-default-arguments-declarations <fuchsia-default-arguments-declarations.html>`_,
`fuchsia-multiple-inheritance <fuchsia-multiple-inheritance.html>`_,
`fuchsia-overloaded-operator <fuchsia-overloaded-operator.html>`_,
`fuchsia-statically-constructed-objects <fuchsia-statically-constructed-objects.html>`_,
@@ -163,7 +165,7 @@
`google-build-namespaces <google-build-namespaces.html>`_,
`google-build-using-namespace <google-build-using-namespace.html>`_,
`google-default-arguments <google-default-arguments.html>`_,
- `google-explicit-constructor <google-explicit-constructor.html>`_, "Yes"
+ `google-explicit-constructor <google-explicit-constructor.html>`_,
`google-global-names-in-headers <google-global-names-in-headers.html>`_,
`google-objc-avoid-nsobject-new <google-objc-avoid-nsobject-new.html>`_,
`google-objc-avoid-throwing-exception <google-objc-avoid-throwing-exception.html>`_,
@@ -175,7 +177,7 @@
`google-runtime-int <google-runtime-int.html>`_,
`google-runtime-operator <google-runtime-operator.html>`_,
`google-runtime-references <google-runtime-references.html>`_,
- `google-upgrade-googletest-case <google-upgrade-googletest-case.html>`_, "Yes"
+ `google-upgrade-googletest-case <google-upgrade-googletest-case.html>`_,
`hicpp-avoid-goto <hicpp-avoid-goto.html>`_,
`hicpp-exception-baseclass <hicpp-exception-baseclass.html>`_,
`hicpp-multiway-paths-covered <hicpp-multiway-paths-covered.html>`_,
@@ -183,121 +185,121 @@
`hicpp-signed-bitwise <hicpp-signed-bitwise.html>`_,
`linuxkernel-must-use-errs <linuxkernel-must-use-errs.html>`_,
`llvm-header-guard <llvm-header-guard.html>`_,
- `llvm-include-order <llvm-include-order.html>`_, "Yes"
+ `llvm-include-order <llvm-include-order.html>`_,
`llvm-namespace-comment <llvm-namespace-comment.html>`_,
- `llvm-prefer-isa-or-dyn-cast-in-conditionals <llvm-prefer-isa-or-dyn-cast-in-conditionals.html>`_, "Yes"
- `llvm-prefer-register-over-unsigned <llvm-prefer-register-over-unsigned.html>`_, "Yes"
- `llvm-twine-local <llvm-twine-local.html>`_, "Yes"
- `llvmlibc-callee-namespace <llvmlibc-calle-namespace.html>`_,
+ `llvm-prefer-isa-or-dyn-cast-in-conditionals <llvm-prefer-isa-or-dyn-cast-in-conditionals.html>`_,
+ `llvm-prefer-register-over-unsigned <llvm-prefer-register-over-unsigned.html>`_,
+ `llvm-twine-local <llvm-twine-local.html>`_,
+ `llvmlibc-callee-namespace <llvmlibc-callee-namespace.html>`_,
`llvmlibc-implementation-in-namespace <llvmlibc-implementation-in-namespace.html>`_,
- `llvmlibc-restrict-system-libc-headers <llvmlibc-restrict-system-libc-headers.html>`_, "Yes"
- `misc-definitions-in-headers <misc-definitions-in-headers.html>`_, "Yes"
+ `llvmlibc-restrict-system-libc-headers <llvmlibc-restrict-system-libc-headers.html>`_,
+ `misc-definitions-in-headers <misc-definitions-in-headers.html>`_,
`misc-misplaced-const <misc-misplaced-const.html>`_,
`misc-new-delete-overloads <misc-new-delete-overloads.html>`_,
`misc-no-recursion <misc-no-recursion.html>`_,
`misc-non-copyable-objects <misc-non-copyable-objects.html>`_,
`misc-non-private-member-variables-in-classes <misc-non-private-member-variables-in-classes.html>`_,
- `misc-redundant-expression <misc-redundant-expression.html>`_, "Yes"
- `misc-static-assert <misc-static-assert.html>`_, "Yes"
+ `misc-redundant-expression <misc-redundant-expression.html>`_,
+ `misc-static-assert <misc-static-assert.html>`_,
`misc-throw-by-value-catch-by-reference <misc-throw-by-value-catch-by-reference.html>`_,
`misc-unconventional-assign-operator <misc-unconventional-assign-operator.html>`_,
- `misc-uniqueptr-reset-release <misc-uniqueptr-reset-release.html>`_, "Yes"
- `misc-unused-alias-decls <misc-unused-alias-decls.html>`_, "Yes"
- `misc-unused-parameters <misc-unused-parameters.html>`_, "Yes"
- `misc-unused-using-decls <misc-unused-using-decls.html>`_, "Yes"
- `modernize-avoid-bind <modernize-avoid-bind.html>`_, "Yes"
+ `misc-uniqueptr-reset-release <misc-uniqueptr-reset-release.html>`_,
+ `misc-unused-alias-decls <misc-unused-alias-decls.html>`_,
+ `misc-unused-parameters <misc-unused-parameters.html>`_,
+ `misc-unused-using-decls <misc-unused-using-decls.html>`_,
+ `modernize-avoid-bind <modernize-avoid-bind.html>`_,
`modernize-avoid-c-arrays <modernize-avoid-c-arrays.html>`_,
- `modernize-concat-nested-namespaces <modernize-concat-nested-namespaces.html>`_, "Yes"
- `modernize-deprecated-headers <modernize-deprecated-headers.html>`_, "Yes"
- `modernize-deprecated-ios-base-aliases <modernize-deprecated-ios-base-aliases.html>`_, "Yes"
- `modernize-loop-convert <modernize-loop-convert.html>`_, "Yes"
- `modernize-make-shared <modernize-make-shared.html>`_, "Yes"
- `modernize-make-unique <modernize-make-unique.html>`_, "Yes"
- `modernize-pass-by-value <modernize-pass-by-value.html>`_, "Yes"
- `modernize-raw-string-literal <modernize-raw-string-literal.html>`_, "Yes"
- `modernize-redundant-void-arg <modernize-redundant-void-arg.html>`_, "Yes"
- `modernize-replace-auto-ptr <modernize-replace-auto-ptr.html>`_, "Yes"
- `modernize-replace-random-shuffle <modernize-replace-random-shuffle.html>`_, "Yes"
- `modernize-return-braced-init-list <modernize-return-braced-init-list.html>`_, "Yes"
- `modernize-shrink-to-fit <modernize-shrink-to-fit.html>`_, "Yes"
- `modernize-unary-static-assert <modernize-unary-static-assert.html>`_, "Yes"
- `modernize-use-auto <modernize-use-auto.html>`_, "Yes"
- `modernize-use-bool-literals <modernize-use-bool-literals.html>`_, "Yes"
- `modernize-use-default-member-init <modernize-use-default-member-init.html>`_, "Yes"
- `modernize-use-emplace <modernize-use-emplace.html>`_, "Yes"
- `modernize-use-equals-default <modernize-use-equals-default.html>`_, "Yes"
- `modernize-use-equals-delete <modernize-use-equals-delete.html>`_, "Yes"
- `modernize-use-nodiscard <modernize-use-nodiscard.html>`_, "Yes"
- `modernize-use-noexcept <modernize-use-noexcept.html>`_, "Yes"
- `modernize-use-nullptr <modernize-use-nullptr.html>`_, "Yes"
- `modernize-use-override <modernize-use-override.html>`_, "Yes"
- `modernize-use-trailing-return-type <modernize-use-trailing-return-type.html>`_, "Yes"
- `modernize-use-transparent-functors <modernize-use-transparent-functors.html>`_, "Yes"
- `modernize-use-uncaught-exceptions <modernize-use-uncaught-exceptions.html>`_, "Yes"
- `modernize-use-using <modernize-use-using.html>`_, "Yes"
- `mpi-buffer-deref <mpi-buffer-deref.html>`_, "Yes"
- `mpi-type-mismatch <mpi-type-mismatch.html>`_, "Yes"
+ `modernize-concat-nested-namespaces <modernize-concat-nested-namespaces.html>`_,
+ `modernize-deprecated-headers <modernize-deprecated-headers.html>`_,
+ `modernize-deprecated-ios-base-aliases <modernize-deprecated-ios-base-aliases.html>`_,
+ `modernize-loop-convert <modernize-loop-convert.html>`_,
+ `modernize-make-shared <modernize-make-shared.html>`_,
+ `modernize-make-unique <modernize-make-unique.html>`_,
+ `modernize-pass-by-value <modernize-pass-by-value.html>`_,
+ `modernize-raw-string-literal <modernize-raw-string-literal.html>`_,
+ `modernize-redundant-void-arg <modernize-redundant-void-arg.html>`_,
+ `modernize-replace-auto-ptr <modernize-replace-auto-ptr.html>`_,
+ `modernize-replace-random-shuffle <modernize-replace-random-shuffle.html>`_,
+ `modernize-return-braced-init-list <modernize-return-braced-init-list.html>`_,
+ `modernize-shrink-to-fit <modernize-shrink-to-fit.html>`_,
+ `modernize-unary-static-assert <modernize-unary-static-assert.html>`_,
+ `modernize-use-auto <modernize-use-auto.html>`_,
+ `modernize-use-bool-literals <modernize-use-bool-literals.html>`_,
+ `modernize-use-default-member-init <modernize-use-default-member-init.html>`_,
+ `modernize-use-emplace <modernize-use-emplace.html>`_,
+ `modernize-use-equals-default <modernize-use-equals-default.html>`_,
+ `modernize-use-equals-delete <modernize-use-equals-delete.html>`_,
+ `modernize-use-nodiscard <modernize-use-nodiscard.html>`_,
+ `modernize-use-noexcept <modernize-use-noexcept.html>`_,
+ `modernize-use-nullptr <modernize-use-nullptr.html>`_,
+ `modernize-use-override <modernize-use-override.html>`_,
+ `modernize-use-trailing-return-type <modernize-use-trailing-return-type.html>`_,
+ `modernize-use-transparent-functors <modernize-use-transparent-functors.html>`_,
+ `modernize-use-uncaught-exceptions <modernize-use-uncaught-exceptions.html>`_,
+ `modernize-use-using <modernize-use-using.html>`_,
+ `mpi-buffer-deref <mpi-buffer-deref.html>`_,
+ `mpi-type-mismatch <mpi-type-mismatch.html>`_,
`objc-avoid-nserror-init <objc-avoid-nserror-init.html>`_,
`objc-dealloc-in-category <objc-dealloc-in-category.html>`_,
`objc-forbidden-subclassing <objc-forbidden-subclassing.html>`_,
`objc-missing-hash <objc-missing-hash.html>`_,
- `objc-nsinvocation-argument-lifetime <objc-nsinvocation-argument-lifetime.html>`_, "Yes"
- `objc-property-declaration <objc-property-declaration.html>`_, "Yes"
- `objc-super-self <objc-super-self.html>`_, "Yes"
+ `objc-nsinvocation-argument-lifetime <objc-nsinvocation-argument-lifetime.html>`_,
+ `objc-property-declaration <objc-property-declaration.html>`_,
+ `objc-super-self <objc-super-self.html>`_,
`openmp-exception-escape <openmp-exception-escape.html>`_,
`openmp-use-default-none <openmp-use-default-none.html>`_,
- `performance-faster-string-find <performance-faster-string-find.html>`_, "Yes"
- `performance-for-range-copy <performance-for-range-copy.html>`_, "Yes"
+ `performance-faster-string-find <performance-faster-string-find.html>`_,
+ `performance-for-range-copy <performance-for-range-copy.html>`_,
`performance-implicit-conversion-in-loop <performance-implicit-conversion-in-loop.html>`_,
- `performance-inefficient-algorithm <performance-inefficient-algorithm.html>`_, "Yes"
+ `performance-inefficient-algorithm <performance-inefficient-algorithm.html>`_,
`performance-inefficient-string-concatenation <performance-inefficient-string-concatenation.html>`_,
- `performance-inefficient-vector-operation <performance-inefficient-vector-operation.html>`_, "Yes"
- `performance-move-const-arg <performance-move-const-arg.html>`_, "Yes"
- `performance-move-constructor-init <performance-move-constructor-init.html>`_, "Yes"
+ `performance-inefficient-vector-operation <performance-inefficient-vector-operation.html>`_,
+ `performance-move-const-arg <performance-move-const-arg.html>`_,
+ `performance-move-constructor-init <performance-move-constructor-init.html>`_,
`performance-no-automatic-move <performance-no-automatic-move.html>`_,
- `performance-noexcept-move-constructor <performance-noexcept-move-constructor.html>`_, "Yes"
- `performance-trivially-destructible <performance-trivially-destructible.html>`_, "Yes"
- `performance-type-promotion-in-math-fn <performance-type-promotion-in-math-fn.html>`_, "Yes"
+ `performance-noexcept-move-constructor <performance-noexcept-move-constructor.html>`_,
+ `performance-trivially-destructible <performance-trivially-destructible.html>`_,
+ `performance-type-promotion-in-math-fn <performance-type-promotion-in-math-fn.html>`_,
`performance-unnecessary-copy-initialization <performance-unnecessary-copy-initialization.html>`_,
- `performance-unnecessary-value-param <performance-unnecessary-value-param.html>`_, "Yes"
- `portability-restrict-system-includes <portability-restrict-system-includes.html>`_, "Yes"
+ `performance-unnecessary-value-param <performance-unnecessary-value-param.html>`_,
+ `portability-restrict-system-includes <portability-restrict-system-includes.html>`_,
`portability-simd-intrinsics <portability-simd-intrinsics.html>`_,
`readability-avoid-const-params-in-decls <readability-avoid-const-params-in-decls.html>`_,
- `readability-braces-around-statements <readability-braces-around-statements.html>`_, "Yes"
- `readability-const-return-type <readability-const-return-type.html>`_, "Yes"
- `readability-container-size-empty <readability-container-size-empty.html>`_, "Yes"
+ `readability-braces-around-statements <readability-braces-around-statements.html>`_,
+ `readability-const-return-type <readability-const-return-type.html>`_,
+ `readability-container-size-empty <readability-container-size-empty.html>`_,
`readability-convert-member-functions-to-static <readability-convert-member-functions-to-static.html>`_,
- `readability-delete-null-pointer <readability-delete-null-pointer.html>`_, "Yes"
+ `readability-delete-null-pointer <readability-delete-null-pointer.html>`_,
`readability-deleted-default <readability-deleted-default.html>`_,
- `readability-else-after-return <readability-else-after-return.html>`_, "Yes"
+ `readability-else-after-return <readability-else-after-return.html>`_,
`readability-function-size <readability-function-size.html>`_,
- `readability-identifier-naming <readability-identifier-naming.html>`_, "Yes"
- `readability-implicit-bool-conversion <readability-implicit-bool-conversion.html>`_, "Yes"
- `readability-inconsistent-declaration-parameter-name <readability-inconsistent-declaration-parameter-name.html>`_, "Yes"
- `readability-isolate-declaration <readability-isolate-declaration.html>`_, "Yes"
+ `readability-identifier-naming <readability-identifier-naming.html>`_,
+ `readability-implicit-bool-conversion <readability-implicit-bool-conversion.html>`_,
+ `readability-inconsistent-declaration-parameter-name <readability-inconsistent-declaration-parameter-name.html>`_,
+ `readability-isolate-declaration <readability-isolate-declaration.html>`_,
`readability-magic-numbers <readability-magic-numbers.html>`_,
- `readability-make-member-function-const <readability-make-member-function-const.html>`_, "Yes"
+ `readability-make-member-function-const <readability-make-member-function-const.html>`_,
`readability-misleading-indentation <readability-misleading-indentation.html>`_,
- `readability-misplaced-array-index <readability-misplaced-array-index.html>`_, "Yes"
- `readability-named-parameter <readability-named-parameter.html>`_, "Yes"
- `readability-non-const-parameter <readability-non-const-parameter.html>`_, "Yes"
- `readability-qualified-auto <readability-qualified-auto.html>`_, "Yes"
- `readability-redundant-access-specifiers <readability-redundant-access-specifiers.html>`_, "Yes"
- `readability-redundant-control-flow <readability-redundant-control-flow.html>`_, "Yes"
- `readability-redundant-declaration <readability-redundant-declaration.html>`_, "Yes"
- `readability-redundant-function-ptr-dereference <readability-redundant-function-ptr-dereference.html>`_, "Yes"
- `readability-redundant-member-init <readability-redundant-member-init.html>`_, "Yes"
+ `readability-misplaced-array-index <readability-misplaced-array-index.html>`_,
+ `readability-named-parameter <readability-named-parameter.html>`_,
+ `readability-non-const-parameter <readability-non-const-parameter.html>`_,
+ `readability-qualified-auto <readability-qualified-auto.html>`_,
+ `readability-redundant-access-specifiers <readability-redundant-access-specifiers.html>`_,
+ `readability-redundant-control-flow <readability-redundant-control-flow.html>`_,
+ `readability-redundant-declaration <readability-redundant-declaration.html>`_,
+ `readability-redundant-function-ptr-dereference <readability-redundant-function-ptr-dereference.html>`_,
+ `readability-redundant-member-init <readability-redundant-member-init.html>`_,
`readability-redundant-preprocessor <readability-redundant-preprocessor.html>`_,
- `readability-redundant-smartptr-get <readability-redundant-smartptr-get.html>`_, "Yes"
+ `readability-redundant-smartptr-get <readability-redundant-smartptr-get.html>`_,
`readability-redundant-string-cstr <readability-redundant-string-cstr.html>`_,
- `readability-redundant-string-init <readability-redundant-string-init.html>`_, "Yes"
- `readability-simplify-boolean-expr <readability-simplify-boolean-expr.html>`_, "Yes"
- `readability-simplify-subscript-expr <readability-simplify-subscript-expr.html>`_, "Yes"
- `readability-static-accessed-through-instance <readability-static-accessed-through-instance.html>`_, "Yes"
- `readability-static-definition-in-anonymous-namespace <readability-static-definition-in-anonymous-namespace.html>`_, "Yes"
- `readability-string-compare <readability-string-compare.html>`_, "Yes"
- `readability-uniqueptr-delete-release <readability-uniqueptr-delete-release.html>`_, "Yes"
- `readability-uppercase-literal-suffix <readability-uppercase-literal-suffix.html>`_, "Yes"
+ `readability-redundant-string-init <readability-redundant-string-init.html>`_,
+ `readability-simplify-boolean-expr <readability-simplify-boolean-expr.html>`_,
+ `readability-simplify-subscript-expr <readability-simplify-subscript-expr.html>`_,
+ `readability-static-accessed-through-instance <readability-static-accessed-through-instance.html>`_,
+ `readability-static-definition-in-anonymous-namespace <readability-static-definition-in-anonymous-namespace.html>`_,
+ `readability-string-compare <readability-string-compare.html>`_,
+ `readability-uniqueptr-delete-release <readability-uniqueptr-delete-release.html>`_,
+ `readability-uppercase-literal-suffix <readability-uppercase-literal-suffix.html>`_,
`zircon-temporary-objects <zircon-temporary-objects.html>`_,
@@ -306,10 +308,10 @@
`cert-con36-c <cert-con36-c.html>`_, `bugprone-spuriously-wake-up-functions <bugprone-spuriously-wake-up-functions.html>`_,
`cert-con54-cpp <cert-con54-cpp.html>`_, `bugprone-spuriously-wake-up-functions <bugprone-spuriously-wake-up-functions.html>`_,
- `cert-dcl03-c <cert-dcl03-c.html>`_, `misc-static-assert <misc-static-assert.html>`_, "Yes"
- `cert-dcl16-c <cert-dcl16-c.html>`_, `readability-uppercase-literal-suffix <readability-uppercase-literal-suffix.html>`_, "Yes"
- `cert-dcl37-c <cert-dcl37-c.html>`_, `bugprone-reserved-identifier <bugprone-reserved-identifier.html>`_, "Yes"
- `cert-dcl51-cpp <cert-dcl51-cpp.html>`_, `bugprone-reserved-identifier <bugprone-reserved-identifier.html>`_, "Yes"
+ `cert-dcl03-c <cert-dcl03-c.html>`_, `misc-static-assert <misc-static-assert.html>`_,
+ `cert-dcl16-c <cert-dcl16-c.html>`_, `readability-uppercase-literal-suffix <readability-uppercase-literal-suffix.html>`_,
+ `cert-dcl37-c <cert-dcl37-c.html>`_, `bugprone-reserved-identifier <bugprone-reserved-identifier.html>`_,
+ `cert-dcl51-cpp <cert-dcl51-cpp.html>`_, `bugprone-reserved-identifier <bugprone-reserved-identifier.html>`_,
`cert-dcl54-cpp <cert-dcl54-cpp.html>`_, `misc-new-delete-overloads <misc-new-delete-overloads.html>`_,
`cert-dcl59-cpp <cert-dcl59-cpp.html>`_, `google-build-namespaces <google-build-namespaces.html>`_,
`cert-err09-cpp <cert-err09-cpp.html>`_, `misc-throw-by-value-catch-by-reference <misc-throw-by-value-catch-by-reference.html>`_,
@@ -317,7 +319,7 @@
`cert-fio38-c <cert-fio38-c.html>`_, `misc-non-copyable-objects <misc-non-copyable-objects.html>`_,
`cert-msc30-c <cert-msc30-c.html>`_, `cert-msc50-cpp <cert-msc50-cpp.html>`_,
`cert-msc32-c <cert-msc32-c.html>`_, `cert-msc51-cpp <cert-msc51-cpp.html>`_,
- `cert-oop11-cpp <cert-oop11-cpp.html>`_, `performance-move-constructor-init <performance-move-constructor-init.html>`_, "Yes"
+ `cert-oop11-cpp <cert-oop11-cpp.html>`_, `performance-move-constructor-init <performance-move-constructor-init.html>`_,
`cert-oop54-cpp <cert-oop54-cpp.html>`_, `bugprone-unhandled-self-assignment <bugprone-unhandled-self-assignment.html>`_,
`cert-pos44-c <cert-pos44-c.html>`_, `bugprone-bad-signal-to-kill-thread <bugprone-bad-signal-to-kill-thread.html>`_,
`cert-str34-c <cert-str34-c.html>`_, `bugprone-signed-char-misuse <bugprone-signed-char-misuse.html>`_,
@@ -387,38 +389,36 @@
`clang-analyzer-unix.cstring.NullArg <clang-analyzer-unix.cstring.NullArg.html>`_, `Clang Static Analyzer <https://clang.llvm.org/docs/analyzer/checkers.html>`_,
`cppcoreguidelines-avoid-c-arrays <cppcoreguidelines-avoid-c-arrays.html>`_, `modernize-avoid-c-arrays <modernize-avoid-c-arrays.html>`_,
`cppcoreguidelines-avoid-magic-numbers <cppcoreguidelines-avoid-magic-numbers.html>`_, `readability-magic-numbers <readability-magic-numbers.html>`_,
- `cppcoreguidelines-avoid-non-const-global-variables <cppcoreguidelines-avoid-non-const-global-variables.html>`_, , , ""
`cppcoreguidelines-c-copy-assignment-signature <cppcoreguidelines-c-copy-assignment-signature.html>`_, `misc-unconventional-assign-operator <misc-unconventional-assign-operator.html>`_,
- `cppcoreguidelines-explicit-virtual-functions <cppcoreguidelines-explicit-virtual-functions.html>`_, `modernize-use-override <modernize-use-override.html>`_, "Yes"
+ `cppcoreguidelines-explicit-virtual-functions <cppcoreguidelines-explicit-virtual-functions.html>`_, `modernize-use-override <modernize-use-override.html>`_,
`cppcoreguidelines-non-private-member-variables-in-classes <cppcoreguidelines-non-private-member-variables-in-classes.html>`_, `misc-non-private-member-variables-in-classes <misc-non-private-member-variables-in-classes.html>`_,
`fuchsia-header-anon-namespaces <fuchsia-header-anon-namespaces.html>`_, `google-build-namespaces <google-build-namespaces.html>`_,
- `google-readability-braces-around-statements <google-readability-braces-around-statements.html>`_, `readability-braces-around-statements <readability-braces-around-statements.html>`_, "Yes"
+ `google-readability-braces-around-statements <google-readability-braces-around-statements.html>`_, `readability-braces-around-statements <readability-braces-around-statements.html>`_,
`google-readability-function-size <google-readability-function-size.html>`_, `readability-function-size <readability-function-size.html>`_,
`google-readability-namespace-comments <google-readability-namespace-comments.html>`_, `llvm-namespace-comment <llvm-namespace-comment.html>`_,
`hicpp-avoid-c-arrays <hicpp-avoid-c-arrays.html>`_, `modernize-avoid-c-arrays <modernize-avoid-c-arrays.html>`_,
- `hicpp-braces-around-statements <hicpp-braces-around-statements.html>`_, `readability-braces-around-statements <readability-braces-around-statements.html>`_, "Yes"
- `hicpp-deprecated-headers <hicpp-deprecated-headers.html>`_, `modernize-deprecated-headers <modernize-deprecated-headers.html>`_, "Yes"
- `hicpp-explicit-conversions <hicpp-explicit-conversions.html>`_, `google-explicit-constructor <google-explicit-constructor.html>`_, "Yes"
+ `hicpp-braces-around-statements <hicpp-braces-around-statements.html>`_, `readability-braces-around-statements <readability-braces-around-statements.html>`_,
+ `hicpp-deprecated-headers <hicpp-deprecated-headers.html>`_, `modernize-deprecated-headers <modernize-deprecated-headers.html>`_,
+ `hicpp-explicit-conversions <hicpp-explicit-conversions.html>`_, `google-explicit-constructor <google-explicit-constructor.html>`_,
`hicpp-function-size <hicpp-function-size.html>`_, `readability-function-size <readability-function-size.html>`_,
`hicpp-invalid-access-moved <hicpp-invalid-access-moved.html>`_, `bugprone-use-after-move <bugprone-use-after-move.html>`_,
- `hicpp-member-init <hicpp-member-init.html>`_, `cppcoreguidelines-pro-type-member-init <cppcoreguidelines-pro-type-member-init.html>`_, "Yes"
- `hicpp-move-const-arg <hicpp-move-const-arg.html>`_, `performance-move-const-arg <performance-move-const-arg.html>`_, "Yes"
- `hicpp-named-parameter <hicpp-named-parameter.html>`_, `readability-named-parameter <readability-named-parameter.html>`_, "Yes"
+ `hicpp-member-init <hicpp-member-init.html>`_, `cppcoreguidelines-pro-type-member-init <cppcoreguidelines-pro-type-member-init.html>`_,
+ `hicpp-move-const-arg <hicpp-move-const-arg.html>`_, `performance-move-const-arg <performance-move-const-arg.html>`_,
+ `hicpp-named-parameter <hicpp-named-parameter.html>`_, `readability-named-parameter <readability-named-parameter.html>`_,
`hicpp-new-delete-operators <hicpp-new-delete-operators.html>`_, `misc-new-delete-overloads <misc-new-delete-overloads.html>`_,
`hicpp-no-array-decay <hicpp-no-array-decay.html>`_, `cppcoreguidelines-pro-bounds-array-to-pointer-decay <cppcoreguidelines-pro-bounds-array-to-pointer-decay.html>`_,
`hicpp-no-malloc <hicpp-no-malloc.html>`_, `cppcoreguidelines-no-malloc <cppcoreguidelines-no-malloc.html>`_,
`hicpp-noexcept-move <hicpp-noexcept-move.html>`_, `performance-noexcept-move-constructor <performance-noexcept-move-constructor.html>`_,
`hicpp-special-member-functions <hicpp-special-member-functions.html>`_, `cppcoreguidelines-special-member-functions <cppcoreguidelines-special-member-functions.html>`_,
- `hicpp-static-assert <hicpp-static-assert.html>`_, `misc-static-assert <misc-static-assert.html>`_, "Yes"
+ `hicpp-static-assert <hicpp-static-assert.html>`_, `misc-static-assert <misc-static-assert.html>`_,
`hicpp-undelegated-constructor <hicpp-undelegated-constructor.html>`_, `bugprone-undelegated-constructor <bugprone-undelegated-constructor.html>`_,
- `hicpp-uppercase-literal-suffix <hicpp-uppercase-literal-suffix.html>`_, `readability-uppercase-literal-suffix <readability-uppercase-literal-suffix.html>`_, "Yes"
- `hicpp-use-auto <hicpp-use-auto.html>`_, `modernize-use-auto <modernize-use-auto.html>`_, "Yes"
- `hicpp-use-emplace <hicpp-use-emplace.html>`_, `modernize-use-emplace <modernize-use-emplace.html>`_, "Yes"
- `hicpp-use-equals-default <hicpp-use-equals-default.html>`_, `modernize-use-equals-default <modernize-use-equals-default.html>`_, "Yes"
- `hicpp-use-equals-delete <hicpp-use-equals-delete.html>`_, `modernize-use-equals-delete <modernize-use-equals-delete.html>`_, "Yes"
- `hicpp-use-noexcept <hicpp-use-noexcept.html>`_, `modernize-use-noexcept <modernize-use-noexcept.html>`_, "Yes"
- `hicpp-use-nullptr <hicpp-use-nullptr.html>`_, `modernize-use-nullptr <modernize-use-nullptr.html>`_, "Yes"
- `hicpp-use-override <hicpp-use-override.html>`_, `modernize-use-override <modernize-use-override.html>`_, "Yes"
+ `hicpp-uppercase-literal-suffix <hicpp-uppercase-literal-suffix.html>`_, `readability-uppercase-literal-suffix <readability-uppercase-literal-suffix.html>`_,
+ `hicpp-use-auto <hicpp-use-auto.html>`_, `modernize-use-auto <modernize-use-auto.html>`_,
+ `hicpp-use-emplace <hicpp-use-emplace.html>`_, `modernize-use-emplace <modernize-use-emplace.html>`_,
+ `hicpp-use-equals-default <hicpp-use-equals-default.html>`_, `modernize-use-equals-default <modernize-use-equals-default.html>`_,
+ `hicpp-use-equals-delete <hicpp-use-equals-delete.html>`_, `modernize-use-equals-delete <modernize-use-equals-delete.html>`_,
+ `hicpp-use-noexcept <hicpp-use-noexcept.html>`_, `modernize-use-noexcept <modernize-use-noexcept.html>`_,
+ `hicpp-use-nullptr <hicpp-use-nullptr.html>`_, `modernize-use-nullptr <modernize-use-nullptr.html>`_,
+ `hicpp-use-override <hicpp-use-override.html>`_, `modernize-use-override <modernize-use-override.html>`_,
`hicpp-vararg <hicpp-vararg.html>`_, `cppcoreguidelines-pro-type-vararg <cppcoreguidelines-pro-type-vararg.html>`_,
- `llvm-qualified-auto <llvm-qualified-auto.html>`_, `readability-qualified-auto <readability-qualified-auto.html>`_, "Yes"
-
+ `llvm-qualified-auto <llvm-qualified-auto.html>`_, `readability-qualified-auto <readability-qualified-auto.html>`_,
Index: clang-tools-extra/docs/clang-tidy/checks/abseil-string-find-str-contains.rst
===================================================================
--- /dev/null
+++ clang-tools-extra/docs/clang-tidy/checks/abseil-string-find-str-contains.rst
@@ -0,0 +1,51 @@
+.. title:: clang-tidy - abseil-string-find-str-contains
+
+abseil-string-find-str-contains
+=============================
+
+Checks whether ``find()`` on a string-like type is compared with ``npos`` on
+a string-like type, and suggests replacing with ``absl::StrContains()``. This
+improves readability and reduces the likelihood of accidentally mixing
+``find()`` and ``npos`` from different string-like types.
+
+By default, "string-like types" includes ``::std::basic_string``,
+``::std::basic_string_view``, and ``::absl::string_view``. See the
+StringLikeClasses option to change this.
+
+.. code-block:: c++
+
+ std::string s = "...";
+ if (s.find("Hello World") == std::string::npos) { /* do something */ }
+
+ absl::string_view a = "...";
+ if (absl::string_view::npos != a.find("Hello World")) { /* do something */ }
+
+becomes
+
+.. code-block:: c++
+
+ string s = "...";
+ if (!absl::StrContains(s, "Hello World")) { /* do something */ }
+
+ absl::string_view a = "...";
+ if (absl::StrContains(a, "Hello World")) { /* do something */ }
+
+
+Options
+-------
+
+.. option:: StringLikeClasses
+
+ Semicolon-separated list of names of string-like classes. By default includes
+ ``::std::basic_string``, ``::std::basic_string_view``, and
+ ``::absl::string_view``.
+
+.. option:: IncludeStyle
+
+ A string specifying which include-style is used, `llvm` or `google`. Default
+ is `llvm`.
+
+.. option:: AbseilStringsMatchHeader
+
+ The location of Abseil's ``strings/match.h``. Defaults to
+ ``absl/strings/match.h``.
Index: clang-tools-extra/docs/ReleaseNotes.rst
===================================================================
--- clang-tools-extra/docs/ReleaseNotes.rst
+++ clang-tools-extra/docs/ReleaseNotes.rst
@@ -75,6 +75,12 @@
New checks
^^^^^^^^^^
+- New :doc:`abseil-string-find-str-contains
+ <clang-tidy/checks/abseil-string-find-str-contains>` check.
+
+ Finds string.find(...) == npos comparisons and suggests replacing with
+ absl::StrContains.
+
- New :doc:`cppcoreguidelines-avoid-non-const-global-variables
<clang-tidy/checks/cppcoreguidelines-avoid-non-const-global-variables>` check.
Finds non-const global variables as described in check I.2 of C++ Core
Index: clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.h
===================================================================
--- /dev/null
+++ clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.h
@@ -0,0 +1,38 @@
+//===--- StringFindStrContainsCheck.h - clang-tidy---------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ABSEIL_STRINGFINDSTRCONTAINSCHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ABSEIL_STRINGFINDSTRCONTAINSCHECK_H
+
+#include "../ClangTidy.h"
+#include "../utils/IncludeInserter.h"
+#include "../utils/TransformerClangTidyCheck.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace clang {
+namespace tidy {
+namespace abseil {
+
+/// Find string.find(...) == npos comparisons and suggest replacing with
+/// absl::StrContains.
+///
+/// For the user-facing documentation see:
+/// http://clang.llvm.org/extra/clang-tidy/checks/abseil-string-find-str-contains.html
+class StringFindStrContainsCheck : public utils::TransformerClangTidyCheck {
+public:
+ StringFindStrContainsCheck(StringRef Name, ClangTidyContext *Context);
+};
+
+} // namespace abseil
+} // namespace tidy
+} // namespace clang
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ABSEIL_STRINGFINDSTRCONTAINSCHECK_H
Index: clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp
===================================================================
--- /dev/null
+++ clang-tools-extra/clang-tidy/abseil/StringFindStrContainsCheck.cpp
@@ -0,0 +1,95 @@
+//===--- StringFindStrContainsCheck.cc - clang-tidy---------------*- C++
+//-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "StringFindStrContainsCheck.h"
+
+#include "../utils/OptionsUtils.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/ASTMatchers/ASTMatchers.h"
+#include "clang/Frontend/CompilerInstance.h"
+#include "clang/Tooling/Transformer/RewriteRule.h"
+#include "clang/Tooling/Transformer/Stencil.h"
+#include <cassert>
+
+using namespace clang::ast_matchers;
+
+namespace clang {
+namespace tidy {
+namespace abseil {
+
+using ::clang::transformer::applyFirst;
+using ::clang::transformer::cat;
+using ::clang::transformer::change;
+using ::clang::transformer::makeRule;
+using ::clang::transformer::node;
+
+namespace {
+
+llvm::Optional<transformer::RewriteRule>
+MakeRule(const LangOptions &LangOpts,
+ const ClangTidyCheck::OptionsView &Options) {
+ // Only support C++.
+ if (!LangOpts.CPlusPlus)
+ return llvm::None;
+
+ // Parse options.
+ const std::vector<std::string> StringLikeClassNames =
+ utils::options::parseStringList(Options.get("StringLikeClasses",
+ "::std::basic_string;"
+ "::std::basic_string_view;"
+ "::absl::string_view"));
+ const std::string AbseilStringsMatchHeaderOption(
+ Options.get("AbseilStringsMatchHeader", "absl/strings/match.h"));
+
+ auto StringLikeClass = cxxRecordDecl(hasAnyName(SmallVector<StringRef, 4>(
+ StringLikeClassNames.begin(), StringLikeClassNames.end())));
+ auto StringType =
+ hasUnqualifiedDesugaredType(recordType(hasDeclaration(StringLikeClass)));
+ auto CharStarType =
+ hasUnqualifiedDesugaredType(pointerType(pointee(isAnyCharacter())));
+ auto StringNpos = declRefExpr(
+ to(varDecl(hasName("npos"), hasDeclContext(StringLikeClass))));
+ auto StringFind = cxxMemberCallExpr(
+ callee(cxxMethodDecl(
+ hasName("find"),
+ hasParameter(0, parmVarDecl(anyOf(hasType(StringType),
+ hasType(CharStarType)))))),
+ on(hasType(StringType)), hasArgument(0, expr().bind("parameter_to_find")),
+ anyOf(hasArgument(1, integerLiteral(equals(0))),
+ hasArgument(1, cxxDefaultArgExpr())),
+ onImplicitObjectArgument(expr().bind("string_being_searched")));
+
+ tooling::RewriteRule rule = applyFirst(
+ {makeRule(
+ binaryOperator(hasOperatorName("=="),
+ hasEitherOperand(ignoringParenImpCasts(StringNpos)),
+ hasEitherOperand(ignoringParenImpCasts(StringFind))),
+ change(cat("!absl::StrContains(", node("string_being_searched"),
+ ", ", node("parameter_to_find"), ")")),
+ cat("use !absl::StrContains instead of find() == npos")),
+ makeRule(
+ binaryOperator(hasOperatorName("!="),
+ hasEitherOperand(ignoringParenImpCasts(StringNpos)),
+ hasEitherOperand(ignoringParenImpCasts(StringFind))),
+ change(cat("absl::StrContains(", node("string_being_searched"), ", ",
+ node("parameter_to_find"), ")")),
+ cat("use absl::StrContains instead of find() != npos"))});
+ addInclude(rule, AbseilStringsMatchHeaderOption);
+ return rule;
+}
+
+} // namespace
+
+StringFindStrContainsCheck::StringFindStrContainsCheck(
+ StringRef Name, ClangTidyContext *Context)
+ : TransformerClangTidyCheck(&MakeRule, Name, Context) {}
+
+} // namespace abseil
+} // namespace tidy
+} // namespace clang
Index: clang-tools-extra/clang-tidy/abseil/CMakeLists.txt
===================================================================
--- clang-tools-extra/clang-tidy/abseil/CMakeLists.txt
+++ clang-tools-extra/clang-tidy/abseil/CMakeLists.txt
@@ -20,6 +20,7 @@
RedundantStrcatCallsCheck.cpp
StrCatAppendCheck.cpp
StringFindStartswithCheck.cpp
+ StringFindStrContainsCheck.cpp
TimeComparisonCheck.cpp
TimeSubtractionCheck.cpp
UpgradeDurationConversionsCheck.cpp
Index: clang-tools-extra/clang-tidy/abseil/AbseilTidyModule.cpp
===================================================================
--- clang-tools-extra/clang-tidy/abseil/AbseilTidyModule.cpp
+++ clang-tools-extra/clang-tidy/abseil/AbseilTidyModule.cpp
@@ -21,8 +21,9 @@
#include "NoInternalDependenciesCheck.h"
#include "NoNamespaceCheck.h"
#include "RedundantStrcatCallsCheck.h"
-#include "StringFindStartswithCheck.h"
#include "StrCatAppendCheck.h"
+#include "StringFindStartswithCheck.h"
+#include "StringFindStrContainsCheck.h"
#include "TimeComparisonCheck.h"
#include "TimeSubtractionCheck.h"
#include "UpgradeDurationConversionsCheck.h"
@@ -61,6 +62,8 @@
"abseil-str-cat-append");
CheckFactories.registerCheck<StringFindStartswithCheck>(
"abseil-string-find-startswith");
+ CheckFactories.registerCheck<StringFindStrContainsCheck>(
+ "abseil-string-find-str-contains");
CheckFactories.registerCheck<TimeComparisonCheck>(
"abseil-time-comparison");
CheckFactories.registerCheck<TimeSubtractionCheck>(
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits