[clang-tools-extra] [clang-tidy] bugprone-unused-return-value config now supports regexes (PR #82952)
FĂ©lix-Antoine Constantin via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 4 06:18:57 PST 2024
https://github.com/felix642 updated https://github.com/llvm/llvm-project/pull/82952
>From 86bc8a57fd56a6b2593af8bcf85d50bbc0ce984e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?F=C3=A9lix-Antoine=20Constantin?=
<felix-antoine.constantin at polymtl.ca>
Date: Sun, 25 Feb 2024 22:05:08 -0500
Subject: [PATCH 1/2] [clang-tidy] bugprone-unused-return-value config now
support regexes
Fixes #63107
---
.../bugprone/UnusedReturnValueCheck.cpp | 202 +++++++++---------
.../bugprone/UnusedReturnValueCheck.h | 6 +-
.../hicpp/IgnoredRemoveResultCheck.cpp | 8 +-
clang-tools-extra/docs/ReleaseNotes.rst | 4 +
.../bugprone/unused-return-value-custom.cpp | 2 +-
5 files changed, 114 insertions(+), 108 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp
index 05012c7df6a975..b4bf85c912c3ca 100644
--- a/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp
@@ -33,98 +33,98 @@ AST_MATCHER_P(FunctionDecl, isInstantiatedFrom, Matcher<FunctionDecl>,
UnusedReturnValueCheck::UnusedReturnValueCheck(llvm::StringRef Name,
ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
- CheckedFunctions(Options.get("CheckedFunctions",
- "::std::async;"
- "::std::launder;"
- "::std::remove;"
- "::std::remove_if;"
- "::std::unique;"
- "::std::unique_ptr::release;"
- "::std::basic_string::empty;"
- "::std::vector::empty;"
- "::std::back_inserter;"
- "::std::distance;"
- "::std::find;"
- "::std::find_if;"
- "::std::inserter;"
- "::std::lower_bound;"
- "::std::make_pair;"
- "::std::map::count;"
- "::std::map::find;"
- "::std::map::lower_bound;"
- "::std::multimap::equal_range;"
- "::std::multimap::upper_bound;"
- "::std::set::count;"
- "::std::set::find;"
- "::std::setfill;"
- "::std::setprecision;"
- "::std::setw;"
- "::std::upper_bound;"
- "::std::vector::at;"
- // C standard library
- "::bsearch;"
- "::ferror;"
- "::feof;"
- "::isalnum;"
- "::isalpha;"
- "::isblank;"
- "::iscntrl;"
- "::isdigit;"
- "::isgraph;"
- "::islower;"
- "::isprint;"
- "::ispunct;"
- "::isspace;"
- "::isupper;"
- "::iswalnum;"
- "::iswprint;"
- "::iswspace;"
- "::isxdigit;"
- "::memchr;"
- "::memcmp;"
- "::strcmp;"
- "::strcoll;"
- "::strncmp;"
- "::strpbrk;"
- "::strrchr;"
- "::strspn;"
- "::strstr;"
- "::wcscmp;"
- // POSIX
- "::access;"
- "::bind;"
- "::connect;"
- "::difftime;"
- "::dlsym;"
- "::fnmatch;"
- "::getaddrinfo;"
- "::getopt;"
- "::htonl;"
- "::htons;"
- "::iconv_open;"
- "::inet_addr;"
- "::isascii;"
- "::isatty;"
- "::mmap;"
- "::newlocale;"
- "::openat;"
- "::pathconf;"
- "::pthread_equal;"
- "::pthread_getspecific;"
- "::pthread_mutex_trylock;"
- "::readdir;"
- "::readlink;"
- "::recvmsg;"
- "::regexec;"
- "::scandir;"
- "::semget;"
- "::setjmp;"
- "::shm_open;"
- "::shmget;"
- "::sigismember;"
- "::strcasecmp;"
- "::strsignal;"
- "::ttyname")),
+ CheckedFunctions(utils::options::parseStringList(
+ Options.get("CheckedFunctions", "::std::async;"
+ "::std::launder;"
+ "::std::remove;"
+ "::std::remove_if;"
+ "::std::unique;"
+ "::std::unique_ptr::release;"
+ "::std::basic_string::empty;"
+ "::std::vector::empty;"
+ "::std::back_inserter;"
+ "::std::distance;"
+ "::std::find;"
+ "::std::find_if;"
+ "::std::inserter;"
+ "::std::lower_bound;"
+ "::std::make_pair;"
+ "::std::map::count;"
+ "::std::map::find;"
+ "::std::map::lower_bound;"
+ "::std::multimap::equal_range;"
+ "::std::multimap::upper_bound;"
+ "::std::set::count;"
+ "::std::set::find;"
+ "::std::setfill;"
+ "::std::setprecision;"
+ "::std::setw;"
+ "::std::upper_bound;"
+ "::std::vector::at;"
+ // C standard library
+ "::bsearch;"
+ "::ferror;"
+ "::feof;"
+ "::isalnum;"
+ "::isalpha;"
+ "::isblank;"
+ "::iscntrl;"
+ "::isdigit;"
+ "::isgraph;"
+ "::islower;"
+ "::isprint;"
+ "::ispunct;"
+ "::isspace;"
+ "::isupper;"
+ "::iswalnum;"
+ "::iswprint;"
+ "::iswspace;"
+ "::isxdigit;"
+ "::memchr;"
+ "::memcmp;"
+ "::strcmp;"
+ "::strcoll;"
+ "::strncmp;"
+ "::strpbrk;"
+ "::strrchr;"
+ "::strspn;"
+ "::strstr;"
+ "::wcscmp;"
+ // POSIX
+ "::access;"
+ "::bind;"
+ "::connect;"
+ "::difftime;"
+ "::dlsym;"
+ "::fnmatch;"
+ "::getaddrinfo;"
+ "::getopt;"
+ "::htonl;"
+ "::htons;"
+ "::iconv_open;"
+ "::inet_addr;"
+ "::isascii;"
+ "::isatty;"
+ "::mmap;"
+ "::newlocale;"
+ "::openat;"
+ "::pathconf;"
+ "::pthread_equal;"
+ "::pthread_getspecific;"
+ "::pthread_mutex_trylock;"
+ "::readdir;"
+ "::readlink;"
+ "::recvmsg;"
+ "::regexec;"
+ "::scandir;"
+ "::semget;"
+ "::setjmp;"
+ "::shm_open;"
+ "::shmget;"
+ "::sigismember;"
+ "::strcasecmp;"
+ "::strsignal;"
+ "::ttyname"))),
CheckedReturnTypes(utils::options::parseStringList(
Options.get("CheckedReturnTypes", "::std::error_code;"
"::std::error_condition;"
@@ -133,36 +133,36 @@ UnusedReturnValueCheck::UnusedReturnValueCheck(llvm::StringRef Name,
"::boost::system::error_code"))),
AllowCastToVoid(Options.get("AllowCastToVoid", false)) {}
-UnusedReturnValueCheck::UnusedReturnValueCheck(llvm::StringRef Name,
- ClangTidyContext *Context,
- std::string CheckedFunctions)
+UnusedReturnValueCheck::UnusedReturnValueCheck(
+ llvm::StringRef Name, ClangTidyContext *Context,
+ std::vector<StringRef> CheckedFunctions)
: UnusedReturnValueCheck(Name, Context, std::move(CheckedFunctions), {},
false) {}
UnusedReturnValueCheck::UnusedReturnValueCheck(
llvm::StringRef Name, ClangTidyContext *Context,
- std::string CheckedFunctions, std::vector<StringRef> CheckedReturnTypes,
- bool AllowCastToVoid)
+ std::vector<StringRef> CheckedFunctions,
+ std::vector<StringRef> CheckedReturnTypes, bool AllowCastToVoid)
: ClangTidyCheck(Name, Context),
CheckedFunctions(std::move(CheckedFunctions)),
CheckedReturnTypes(std::move(CheckedReturnTypes)),
AllowCastToVoid(AllowCastToVoid) {}
void UnusedReturnValueCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
- Options.store(Opts, "CheckedFunctions", CheckedFunctions);
+ Options.store(Opts, "CheckedFunctions",
+ utils::options::serializeStringList(CheckedFunctions));
Options.store(Opts, "CheckedReturnTypes",
utils::options::serializeStringList(CheckedReturnTypes));
Options.store(Opts, "AllowCastToVoid", AllowCastToVoid);
}
void UnusedReturnValueCheck::registerMatchers(MatchFinder *Finder) {
- auto FunVec = utils::options::parseStringList(CheckedFunctions);
-
auto MatchedDirectCallExpr =
expr(callExpr(callee(functionDecl(
// Don't match void overloads of checked functions.
unless(returns(voidType())),
- anyOf(isInstantiatedFrom(hasAnyName(FunVec)),
+ anyOf(isInstantiatedFrom(matchers::matchesAnyListedName(
+ CheckedFunctions)),
returns(hasCanonicalType(hasDeclaration(
namedDecl(matchers::matchesAnyListedName(
CheckedReturnTypes)))))))))
diff --git a/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.h b/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.h
index ab2cc691b894f7..d65a567e1c468a 100644
--- a/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.h
+++ b/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.h
@@ -29,14 +29,14 @@ class UnusedReturnValueCheck : public ClangTidyCheck {
}
private:
- std::string CheckedFunctions;
+ const std::vector<StringRef> CheckedFunctions;
const std::vector<StringRef> CheckedReturnTypes;
protected:
UnusedReturnValueCheck(StringRef Name, ClangTidyContext *Context,
- std::string CheckedFunctions);
+ std::vector<StringRef> CheckedFunctions);
UnusedReturnValueCheck(StringRef Name, ClangTidyContext *Context,
- std::string CheckedFunctions,
+ std::vector<StringRef> CheckedFunctions,
std::vector<StringRef> CheckedReturnTypes,
bool AllowCastToVoid);
bool AllowCastToVoid;
diff --git a/clang-tools-extra/clang-tidy/hicpp/IgnoredRemoveResultCheck.cpp b/clang-tools-extra/clang-tidy/hicpp/IgnoredRemoveResultCheck.cpp
index 3410559d435f63..8020f8cd062510 100644
--- a/clang-tools-extra/clang-tidy/hicpp/IgnoredRemoveResultCheck.cpp
+++ b/clang-tools-extra/clang-tidy/hicpp/IgnoredRemoveResultCheck.cpp
@@ -13,9 +13,11 @@ namespace clang::tidy::hicpp {
IgnoredRemoveResultCheck::IgnoredRemoveResultCheck(llvm::StringRef Name,
ClangTidyContext *Context)
: UnusedReturnValueCheck(Name, Context,
- "::std::remove;"
- "::std::remove_if;"
- "::std::unique") {
+ {
+ "::std::remove",
+ "::std::remove_if",
+ "::std::unique",
+ }) {
// The constructor for ClangTidyCheck needs to have been called
// before we can access options via Options.get().
AllowCastToVoid = Options.get("AllowCastToVoid", true);
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 6fd01ed9d471c5..2223e58947f600 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -134,6 +134,10 @@ Changes in existing checks
<clang-tidy/checks/bugprone/unused-local-non-trivial-variable>` check by
ignoring local variable with ``[maybe_unused]`` attribute.
+ - Improved :doc:`bugprone-unused-return-value
+ <clang-tidy/checks/bugprone/unused-return-value>` check by updating the
+ parameter `CheckedFunctions` to support regex
+
- Cleaned up :doc:`cppcoreguidelines-prefer-member-initializer
<clang-tidy/checks/cppcoreguidelines/prefer-member-initializer>`
by removing enforcement of rule `C.48
diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-custom.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-custom.cpp
index d3650b210ab02b..3035183573ccd7 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-custom.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-custom.cpp
@@ -1,7 +1,7 @@
// RUN: %check_clang_tidy %s bugprone-unused-return-value %t \
// RUN: -config='{CheckOptions: \
// RUN: {bugprone-unused-return-value.CheckedFunctions: \
-// RUN: "::fun;::ns::Outer::Inner::memFun;::ns::Type::staticFun;::ns::ClassTemplate::memFun;::ns::ClassTemplate::staticFun"}}' \
+// RUN: "::fun;::ns::Outer::Inner::memFun;::ns::Type::staticFun;::ns::ClassTemplate::(mem|static)Fun"}}' \
// RUN: --
namespace std {
>From eed343aff4c9069a99a19addf18a91ce4d7a8856 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?F=C3=A9lix-Antoine=20Constantin?=
<felix-antoine.constantin at bidgroup.ca>
Date: Mon, 4 Mar 2024 09:17:11 -0500
Subject: [PATCH 2/2] fixup! [clang-tidy] bugprone-unused-return-value config
now support regexes
Updated documentation
---
.../docs/clang-tidy/checks/bugprone/unused-return-value.rst | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/unused-return-value.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/unused-return-value.rst
index 1e3c8a3268222e..8d5eddbe215cb8 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/bugprone/unused-return-value.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/unused-return-value.rst
@@ -10,8 +10,9 @@ Options
.. option:: CheckedFunctions
- Semicolon-separated list of functions to check. The function is checked if
- the name and scope matches, with any arguments.
+ Semicolon-separated list of functions to check.
+ This parameter supports regexp. The function is checked if the name
+ and scope matches, with any arguments.
By default the following functions are checked:
``std::async, std::launder, std::remove, std::remove_if, std::unique,
std::unique_ptr::release, std::basic_string::empty, std::vector::empty,
More information about the cfe-commits
mailing list