https://github.com/balazske created https://github.com/llvm/llvm-project/pull/192031
None From 3053c2a9516ca4d05181ead13c284955fe7bc0dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20K=C3=A9ri?= <[email protected]> Date: Mon, 13 Apr 2026 11:40:13 +0200 Subject: [PATCH] [clang-tidy] Add option 'IgnoredTypes' to bugprone-throwing-static-initialization --- .../ThrowingStaticInitializationCheck.cpp | 18 +++++++- .../ThrowingStaticInitializationCheck.h | 7 ++- clang-tools-extra/docs/ReleaseNotes.rst | 5 +++ .../throwing-static-initialization.rst | 13 ++++++ .../throwing-static-initialization-ignore.cpp | 44 +++++++++++++++++++ 5 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 clang-tools-extra/test/clang-tidy/checkers/bugprone/throwing-static-initialization-ignore.cpp diff --git a/clang-tools-extra/clang-tidy/bugprone/ThrowingStaticInitializationCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/ThrowingStaticInitializationCheck.cpp index 80905e260d5d4..6d0db9b08f651 100644 --- a/clang-tools-extra/clang-tidy/bugprone/ThrowingStaticInitializationCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/ThrowingStaticInitializationCheck.cpp @@ -7,6 +7,8 @@ //===----------------------------------------------------------------------===// #include "ThrowingStaticInitializationCheck.h" +#include "../utils/Matchers.h" +#include "../utils/OptionsUtils.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" @@ -14,6 +16,18 @@ using namespace clang::ast_matchers; namespace clang::tidy::bugprone { +ThrowingStaticInitializationCheck::ThrowingStaticInitializationCheck( + StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context), + IgnoredTypes( + utils::options::parseStringList(Options.get("IgnoredTypes", ""))) {} + +void ThrowingStaticInitializationCheck::storeOptions( + ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "IgnoredTypes", + utils::options::serializeStringList(IgnoredTypes)); +} + void ThrowingStaticInitializationCheck::registerMatchers(MatchFinder *Finder) { // Match any static or thread_local variable declaration that has an // initializer that can throw. @@ -23,7 +37,9 @@ void ThrowingStaticInitializationCheck::registerMatchers(MatchFinder *Finder) { varDecl( anyOf(hasThreadStorageDuration(), hasStaticStorageDuration()), unless(anyOf(isConstexpr(), hasType(cxxRecordDecl(isLambda())), - hasAncestor(functionDecl()))), + hasAncestor(functionDecl()), + hasType(tidy::matchers::matchesAnyListedTypeName( + IgnoredTypes)))), anyOf(hasDescendant(cxxConstructExpr(hasDeclaration( cxxConstructorDecl(unless(isNoThrow())).bind("func")))), hasDescendant(cxxNewExpr(hasDeclaration( diff --git a/clang-tools-extra/clang-tidy/bugprone/ThrowingStaticInitializationCheck.h b/clang-tools-extra/clang-tidy/bugprone/ThrowingStaticInitializationCheck.h index a25d7fe889e16..9652cfa4835b6 100644 --- a/clang-tools-extra/clang-tidy/bugprone/ThrowingStaticInitializationCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/ThrowingStaticInitializationCheck.h @@ -20,13 +20,16 @@ namespace clang::tidy::bugprone { /// https://clang.llvm.org/extra/clang-tidy/checks/bugprone/throwing-static-initialization.html class ThrowingStaticInitializationCheck : public ClangTidyCheck { public: - ThrowingStaticInitializationCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context) {} + ThrowingStaticInitializationCheck(StringRef Name, ClangTidyContext *Context); + void storeOptions(ClangTidyOptions::OptionMap &Opts) override; bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { return LangOpts.CPlusPlus && LangOpts.CXXExceptions; } void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; + +private: + const std::vector<StringRef> IgnoredTypes; }; } // namespace clang::tidy::bugprone diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index caf0275035064..1787d4f9228fa 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -271,6 +271,11 @@ Changes in existing checks string constructor calls when the string class constructor has a default allocator argument. +- Improved :doc:`bugprone-throwing-static-initialization + <clang-tidy/checks/bugprone/throwing-static-initialization>` check by adding + the `IgnoredTypes` option. With this option it is possible to exclude + static declarations with specific types from the check. + - Improved :doc:`bugprone-unchecked-optional-access <clang-tidy/checks/bugprone/unchecked-optional-access>` to recognize common GoogleTest macros such as ``ASSERT_TRUE`` and ``ASSERT_FALSE``, reducing the diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/throwing-static-initialization.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/throwing-static-initialization.rst index 4f88719dd6f5c..f9869b2285dfe 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/bugprone/throwing-static-initialization.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/throwing-static-initialization.rst @@ -6,6 +6,19 @@ bugprone-throwing-static-initialization Finds all ``static`` or ``thread_local`` variable declarations where the initializer for the object may throw an exception. +Options +------- + +.. option:: IgnoredTypes + +This option makes it possible to ignore specific types used at variable +declarations. It may contain a semicolon-separated list of regular expressions. +Declarations with a type that is matched by this list are excluded from +producing warnings by the check. The entries of the list are matched as +substrings of the type name. + +This option contains by default an empty string. + References ---------- diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/throwing-static-initialization-ignore.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/throwing-static-initialization-ignore.cpp new file mode 100644 index 0000000000000..097063846fc3a --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/throwing-static-initialization-ignore.cpp @@ -0,0 +1,44 @@ +// RUN: %check_clang_tidy %s bugprone-throwing-static-initialization %t -- \ +// RUN: -config="{CheckOptions: \ +// RUN: {bugprone-throwing-static-initialization.IgnoredTypes: \"Ignore;^ns::S1$;^ns::Template<1>$\"}}" \ +// RUN: -- -fexceptions + +struct S1 { + S1() noexcept(false); +}; + +struct S1_Ignore { + S1_Ignore() noexcept(false); +}; + +namespace ns { +struct S1 { + S1(); +}; +struct S1_Ignore { + S1_Ignore(); +}; +template<int> +struct Template { + Template() noexcept(false); +}; +} + +template<class> +struct TemplateIgnored { + TemplateIgnored() noexcept(false); +}; + +S1_Ignore getS1() noexcept(false); + +S1 VarThrow; +// CHECK-MESSAGES: :[[@LINE-1]]:4: warning: initialization of 'VarThrow' with static storage duration may throw an exception that cannot be caught +ns::Template<2> VarTempl; +// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: initialization of 'VarTempl' with static storage duration may throw an exception that cannot be caught + +S1_Ignore VarIgnoreConstr; +S1_Ignore VarIgnoreInitF = getS1(); +ns::S1 VarIgnore2; +ns::S1_Ignore VarIgnore3; +TemplateIgnored<int> VarIgnore4; +ns::Template<1> VarIgnore5; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
