From 414975e7cb52c6cbe0bf3a8304c0661489de63ee Mon Sep 17 00:00:00 2001 From: mtx Date: Sat, 20 Sep 2025 00:44:22 +0800 Subject: [PATCH 1/4] [clang-tidy] Rename 'cert-err52-cpp' to 'bugprone-avoid-setjmp-longjmp' --- .../AvoidSetjmpLongjmpCheck.cpp} | 20 +++++++++---------- .../AvoidSetjmpLongjmpCheck.h} | 16 +++++++-------- .../bugprone/BugproneTidyModule.cpp | 3 +++ .../clang-tidy/bugprone/CMakeLists.txt | 1 + .../clang-tidy/cert/CERTTidyModule.cpp | 10 ++++++---- .../clang-tidy/cert/CMakeLists.txt | 1 - clang-tools-extra/docs/ReleaseNotes.rst | 5 +++++ .../checks/bugprone/avoid-setjmp-longjmp.rst | 10 ++++++++++ .../docs/clang-tidy/checks/cert/err52-cpp.rst | 8 +++----- .../docs/clang-tidy/checks/list.rst | 3 ++- .../avoid-setjmp-longjmp.cpp} | 4 ++-- 11 files changed, 50 insertions(+), 31 deletions(-) rename clang-tools-extra/clang-tidy/{cert/SetLongJmpCheck.cpp => bugprone/AvoidSetjmpLongjmpCheck.cpp} (77%) rename clang-tools-extra/clang-tidy/{cert/SetLongJmpCheck.h => bugprone/AvoidSetjmpLongjmpCheck.h} (65%) create mode 100644 clang-tools-extra/docs/clang-tidy/checks/bugprone/avoid-setjmp-longjmp.rst rename clang-tools-extra/test/clang-tidy/checkers/{cert/setlongjmp.cpp => bugprone/avoid-setjmp-longjmp.cpp} (83%) diff --git a/clang-tools-extra/clang-tidy/cert/SetLongJmpCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/AvoidSetjmpLongjmpCheck.cpp similarity index 77% rename from clang-tools-extra/clang-tidy/cert/SetLongJmpCheck.cpp rename to clang-tools-extra/clang-tidy/bugprone/AvoidSetjmpLongjmpCheck.cpp index 4f282b2c6b344..d6be7ece24358 100644 --- a/clang-tools-extra/clang-tidy/cert/SetLongJmpCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/AvoidSetjmpLongjmpCheck.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -#include "SetLongJmpCheck.h" +#include "AvoidSetjmpLongjmpCheck.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/Frontend/CompilerInstance.h" @@ -15,17 +15,18 @@ using namespace clang::ast_matchers; -namespace clang::tidy::cert { +namespace clang::tidy::bugprone { namespace { const char DiagWording[] = "do not call %0; consider using exception handling instead"; class SetJmpMacroCallbacks : public PPCallbacks { - SetLongJmpCheck &Check; + AvoidSetjmpLongjmpCheck &Check; public: - explicit SetJmpMacroCallbacks(SetLongJmpCheck &Check) : Check(Check) {} + explicit SetJmpMacroCallbacks(AvoidSetjmpLongjmpCheck &Check) + : Check(Check) {} void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD, SourceRange Range, const MacroArgs *Args) override { @@ -39,15 +40,14 @@ class SetJmpMacroCallbacks : public PPCallbacks { }; } // namespace -void SetLongJmpCheck::registerPPCallbacks(const SourceManager &SM, - Preprocessor *PP, - Preprocessor *ModuleExpanderPP) { +void AvoidSetjmpLongjmpCheck::registerPPCallbacks( + const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { // Per [headers]p5, setjmp must be exposed as a macro instead of a function, // despite the allowance in C for setjmp to also be an extern function. PP->addPPCallbacks(std::make_unique(*this)); } -void SetLongJmpCheck::registerMatchers(MatchFinder *Finder) { +void AvoidSetjmpLongjmpCheck::registerMatchers(MatchFinder *Finder) { // In case there is an implementation that happens to define setjmp as a // function instead of a macro, this will also catch use of it. However, we // are primarily searching for uses of longjmp. @@ -57,9 +57,9 @@ void SetLongJmpCheck::registerMatchers(MatchFinder *Finder) { this); } -void SetLongJmpCheck::check(const MatchFinder::MatchResult &Result) { +void AvoidSetjmpLongjmpCheck::check(const MatchFinder::MatchResult &Result) { const auto *E = Result.Nodes.getNodeAs("expr"); diag(E->getExprLoc(), DiagWording) << cast(E->getCalleeDecl()); } -} // namespace clang::tidy::cert +} // namespace clang::tidy::bugprone diff --git a/clang-tools-extra/clang-tidy/cert/SetLongJmpCheck.h b/clang-tools-extra/clang-tidy/bugprone/AvoidSetjmpLongjmpCheck.h similarity index 65% rename from clang-tools-extra/clang-tidy/cert/SetLongJmpCheck.h rename to clang-tools-extra/clang-tidy/bugprone/AvoidSetjmpLongjmpCheck.h index ced3d8cd1b316..c317f9434729f 100644 --- a/clang-tools-extra/clang-tidy/cert/SetLongJmpCheck.h +++ b/clang-tools-extra/clang-tidy/bugprone/AvoidSetjmpLongjmpCheck.h @@ -6,20 +6,20 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_SETLONGJMPCHECK_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_SETLONGJMPCHECK_H +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_AVOIDSETJMPLONGJMPCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_AVOIDSETJMPLONGJMPCHECK_H #include "../ClangTidyCheck.h" -namespace clang::tidy::cert { +namespace clang::tidy::bugprone { /// Guards against use of setjmp/longjmp in C++ code /// /// For the user-facing documentation see: -/// http://clang.llvm.org/extra/clang-tidy/checks/cert/err52-cpp.html -class SetLongJmpCheck : public ClangTidyCheck { +/// http://clang.llvm.org/extra/clang-tidy/checks/bugprone/avoid-setjmp-longjmp.html +class AvoidSetjmpLongjmpCheck : public ClangTidyCheck { public: - SetLongJmpCheck(StringRef Name, ClangTidyContext *Context) + AvoidSetjmpLongjmpCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { return LangOpts.CPlusPlus; @@ -30,6 +30,6 @@ class SetLongJmpCheck : public ClangTidyCheck { Preprocessor *ModuleExpanderPP) override; }; -} // namespace clang::tidy::cert +} // namespace clang::tidy::bugprone -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_SETLONGJMPCHECK_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_AVOIDSETJMPLONGJMPCHECK_H diff --git a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp index 8baa8f6b35d4c..7897ba5752776 100644 --- a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp @@ -12,6 +12,7 @@ #include "ArgumentCommentCheck.h" #include "AssertSideEffectCheck.h" #include "AssignmentInIfConditionCheck.h" +#include "AvoidSetjmpLongjmpCheck.h" #include "BadSignalToKillThreadCheck.h" #include "BitwisePointerCastCheck.h" #include "BoolPointerImplicitConversionCheck.h" @@ -117,6 +118,8 @@ class BugproneModule : public ClangTidyModule { "bugprone-assert-side-effect"); CheckFactories.registerCheck( "bugprone-assignment-in-if-condition"); + CheckFactories.registerCheck( + "bugprone-avoid-setjmp-longjmp"); CheckFactories.registerCheck( "bugprone-bad-signal-to-kill-thread"); CheckFactories.registerCheck( diff --git a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt index b0dbe84a16cd4..4f4abc741b668 100644 --- a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt @@ -7,6 +7,7 @@ add_clang_library(clangTidyBugproneModule STATIC ArgumentCommentCheck.cpp AssertSideEffectCheck.cpp AssignmentInIfConditionCheck.cpp + AvoidSetjmpLongjmpCheck.cpp BadSignalToKillThreadCheck.cpp BitwisePointerCastCheck.cpp BoolPointerImplicitConversionCheck.cpp diff --git a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp index c60397384e273..4f4fefa8c9b25 100644 --- a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp @@ -9,6 +9,7 @@ #include "../ClangTidy.h" #include "../ClangTidyModule.h" #include "../ClangTidyModuleRegistry.h" +#include "../bugprone/AvoidSetjmpLongjmpCheck.h" #include "../bugprone/BadSignalToKillThreadCheck.h" #include "../bugprone/PointerArithmeticOnPolymorphicObjectCheck.h" #include "../bugprone/ReservedIdentifierCheck.h" @@ -40,14 +41,13 @@ #include "MutatingCopyCheck.h" #include "NonTrivialTypesLibcMemoryCallsCheck.h" #include "ProperlySeededRandomGeneratorCheck.h" -#include "SetLongJmpCheck.h" #include "ThrownExceptionTypeCheck.h" namespace { // Checked functions for cert-err33-c. -// The following functions are deliberately excluded because they can be called -// with NULL argument and in this case the check is not applicable: +// The following functions are deliberately excluded because they can be +// called with NULL argument and in this case the check is not applicable: // `mblen, mbrlen, mbrtowc, mbtowc, wctomb, wctomb_s`. // FIXME: The check can be improved to handle such cases. const llvm::StringRef CertErr33CCheckedFunctions = "^::aligned_alloc$;" @@ -257,9 +257,11 @@ class CERTModule : public ClangTidyModule { // ERR CheckFactories.registerCheck( "cert-err09-cpp"); - CheckFactories.registerCheck("cert-err52-cpp"); + CheckFactories.registerCheck( + "cert-err52-cpp"); CheckFactories.registerCheck( "cert-err58-cpp"); + CheckFactories.registerCheck("cert-err58-cpp"); CheckFactories.registerCheck("cert-err60-cpp"); CheckFactories.registerCheck( "cert-err61-cpp"); diff --git a/clang-tools-extra/clang-tidy/cert/CMakeLists.txt b/clang-tools-extra/clang-tidy/cert/CMakeLists.txt index aee7ba171fac0..4933763f03fb5 100644 --- a/clang-tools-extra/clang-tidy/cert/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/cert/CMakeLists.txt @@ -13,7 +13,6 @@ add_clang_library(clangTidyCERTModule STATIC MutatingCopyCheck.cpp NonTrivialTypesLibcMemoryCallsCheck.cpp ProperlySeededRandomGeneratorCheck.cpp - SetLongJmpCheck.cpp ThrownExceptionTypeCheck.cpp LINK_LIBS diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index d352f54e2b8dd..64a514da4e9d6 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -216,6 +216,11 @@ New check aliases ` keeping initial check as an alias to the new one. +- Renamed :doc:`cert-err52-cpp ` to + :doc:`bugprone-avoid-setjmp-longjmp + ` + keeping initial check as an alias to the new one. + - Renamed :doc:`cert-err58-cpp ` to :doc:`bugprone-throwing-static-initialization ` diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/avoid-setjmp-longjmp.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/avoid-setjmp-longjmp.rst new file mode 100644 index 0000000000000..e3229d82767e2 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/avoid-setjmp-longjmp.rst @@ -0,0 +1,10 @@ +.. title:: clang-tidy - bugprone-avoid-setjmp-longjmp + +bugprone-avoid-setjmp-longjmp +============================= + +Flags all call expressions involving ``setjmp()`` and ``longjmp()``. + +This check corresponds to the CERT C++ Coding Standard rule +`ERR52-CPP. Do not use setjmp() or longjmp() +`_. diff --git a/clang-tools-extra/docs/clang-tidy/checks/cert/err52-cpp.rst b/clang-tools-extra/docs/clang-tidy/checks/cert/err52-cpp.rst index a29dc7bcd3243..000ebc3ce6a89 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/cert/err52-cpp.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/cert/err52-cpp.rst @@ -3,8 +3,6 @@ cert-err52-cpp ============== -This check flags all call expressions involving ``setjmp()`` and ``longjmp()``. - -This check corresponds to the CERT C++ Coding Standard rule -`ERR52-CPP. Do not use setjmp() or longjmp() -`_. +The cert-err52-cpp check is an alias, please see +`bugprone-avoid-setjmp-longjmp <../bugprone/avoid-setjmp-longjmp.html>`_ +for more information. diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index 2f05b2ee400a7..f310db3870de4 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -80,6 +80,7 @@ Clang-Tidy Checks :doc:`bugprone-argument-comment `, "Yes" :doc:`bugprone-assert-side-effect `, :doc:`bugprone-assignment-in-if-condition `, + :doc:`bugprone-avoid-setjmp-longjmp `, :doc:`bugprone-bad-signal-to-kill-thread `, :doc:`bugprone-bitwise-pointer-cast `, :doc:`bugprone-bool-pointer-implicit-conversion `, "Yes" @@ -175,7 +176,6 @@ Clang-Tidy Checks :doc:`cert-dcl58-cpp `, :doc:`cert-env33-c `, :doc:`cert-err33-c `, - :doc:`cert-err52-cpp `, :doc:`cert-err60-cpp `, :doc:`cert-flp30-c `, :doc:`cert-mem57-cpp `, @@ -441,6 +441,7 @@ Check aliases :doc:`cert-dcl59-cpp `, :doc:`google-build-namespaces `, :doc:`cert-err09-cpp `, :doc:`misc-throw-by-value-catch-by-reference `, :doc:`cert-err34-c `, :doc:`bugprone-unchecked-string-to-number-conversion `, + :doc:`cert-err52-cpp `, :doc:`bugprone-avoid-setjmp-longjmp `, :doc:`cert-err58-cpp `, :doc:`bugprone-throwing-static-initialization `, :doc:`cert-err61-cpp `, :doc:`misc-throw-by-value-catch-by-reference `, :doc:`cert-exp42-c `, :doc:`bugprone-suspicious-memory-comparison `, diff --git a/clang-tools-extra/test/clang-tidy/checkers/cert/setlongjmp.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/avoid-setjmp-longjmp.cpp similarity index 83% rename from clang-tools-extra/test/clang-tidy/checkers/cert/setlongjmp.cpp rename to clang-tools-extra/test/clang-tidy/checkers/bugprone/avoid-setjmp-longjmp.cpp index 88d1db35f6b6a..751ad005db102 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/cert/setlongjmp.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/avoid-setjmp-longjmp.cpp @@ -1,4 +1,4 @@ -// RUN: %check_clang_tidy %s cert-err52-cpp %t +// RUN: %check_clang_tidy %s bugprone-avoid-setjmp-longjmp %t typedef void *jmp_buf; extern int __setjmpimpl(jmp_buf); @@ -13,7 +13,7 @@ using ::longjmp; static jmp_buf env; void g() { std::longjmp(env, 1); - // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not call 'longjmp'; consider using exception handling instead [cert-err52-cpp] + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not call 'longjmp'; consider using exception handling instead [bugprone-avoid-setjmp-longjmp] ::longjmp(env, 1); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not call 'longjmp'; consider using exception handling instead longjmp(env, 1); From bd26b60feb251fb65d58c4ee5cb5de1ddb8e8dd8 Mon Sep 17 00:00:00 2001 From: mtx Date: Mon, 22 Sep 2025 11:17:13 +0800 Subject: [PATCH 2/4] move `avoid-setjmp-longjmp` from `bugprone` to `modernize` --- .../clang-tidy/bugprone/BugproneTidyModule.cpp | 3 --- clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt | 1 - clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp | 5 ++--- .../AvoidSetjmpLongjmpCheck.cpp | 4 ++-- .../AvoidSetjmpLongjmpCheck.h | 12 ++++++------ .../clang-tidy/modernize/CMakeLists.txt | 1 + .../clang-tidy/modernize/ModernizeTidyModule.cpp | 3 +++ clang-tools-extra/docs/ReleaseNotes.rst | 4 ++-- .../docs/clang-tidy/checks/cert/err52-cpp.rst | 6 +++++- clang-tools-extra/docs/clang-tidy/checks/list.rst | 4 ++-- .../{bugprone => modernize}/avoid-setjmp-longjmp.rst | 6 +++--- .../{bugprone => modernize}/avoid-setjmp-longjmp.cpp | 4 ++-- 12 files changed, 28 insertions(+), 25 deletions(-) rename clang-tools-extra/clang-tidy/{bugprone => modernize}/AvoidSetjmpLongjmpCheck.cpp (96%) rename clang-tools-extra/clang-tidy/{bugprone => modernize}/AvoidSetjmpLongjmpCheck.h (73%) rename clang-tools-extra/docs/clang-tidy/checks/{bugprone => modernize}/avoid-setjmp-longjmp.rst (69%) rename clang-tools-extra/test/clang-tidy/checkers/{bugprone => modernize}/avoid-setjmp-longjmp.cpp (83%) diff --git a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp index 7897ba5752776..8baa8f6b35d4c 100644 --- a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp @@ -12,7 +12,6 @@ #include "ArgumentCommentCheck.h" #include "AssertSideEffectCheck.h" #include "AssignmentInIfConditionCheck.h" -#include "AvoidSetjmpLongjmpCheck.h" #include "BadSignalToKillThreadCheck.h" #include "BitwisePointerCastCheck.h" #include "BoolPointerImplicitConversionCheck.h" @@ -118,8 +117,6 @@ class BugproneModule : public ClangTidyModule { "bugprone-assert-side-effect"); CheckFactories.registerCheck( "bugprone-assignment-in-if-condition"); - CheckFactories.registerCheck( - "bugprone-avoid-setjmp-longjmp"); CheckFactories.registerCheck( "bugprone-bad-signal-to-kill-thread"); CheckFactories.registerCheck( diff --git a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt index 4f4abc741b668..b0dbe84a16cd4 100644 --- a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt @@ -7,7 +7,6 @@ add_clang_library(clangTidyBugproneModule STATIC ArgumentCommentCheck.cpp AssertSideEffectCheck.cpp AssignmentInIfConditionCheck.cpp - AvoidSetjmpLongjmpCheck.cpp BadSignalToKillThreadCheck.cpp BitwisePointerCastCheck.cpp BoolPointerImplicitConversionCheck.cpp diff --git a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp index 4f4fefa8c9b25..9ba62219afee9 100644 --- a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp @@ -9,7 +9,6 @@ #include "../ClangTidy.h" #include "../ClangTidyModule.h" #include "../ClangTidyModuleRegistry.h" -#include "../bugprone/AvoidSetjmpLongjmpCheck.h" #include "../bugprone/BadSignalToKillThreadCheck.h" #include "../bugprone/PointerArithmeticOnPolymorphicObjectCheck.h" #include "../bugprone/ReservedIdentifierCheck.h" @@ -29,6 +28,7 @@ #include "../misc/NonCopyableObjects.h" #include "../misc/StaticAssertCheck.h" #include "../misc/ThrowByValueCatchByReferenceCheck.h" +#include "../modernize/AvoidSetjmpLongjmpCheck.h" #include "../modernize/AvoidVariadicFunctionsCheck.h" #include "../performance/MoveConstructorInitCheck.h" #include "../readability/EnumInitialValueCheck.h" @@ -257,11 +257,10 @@ class CERTModule : public ClangTidyModule { // ERR CheckFactories.registerCheck( "cert-err09-cpp"); - CheckFactories.registerCheck( + CheckFactories.registerCheck( "cert-err52-cpp"); CheckFactories.registerCheck( "cert-err58-cpp"); - CheckFactories.registerCheck("cert-err58-cpp"); CheckFactories.registerCheck("cert-err60-cpp"); CheckFactories.registerCheck( "cert-err61-cpp"); diff --git a/clang-tools-extra/clang-tidy/bugprone/AvoidSetjmpLongjmpCheck.cpp b/clang-tools-extra/clang-tidy/modernize/AvoidSetjmpLongjmpCheck.cpp similarity index 96% rename from clang-tools-extra/clang-tidy/bugprone/AvoidSetjmpLongjmpCheck.cpp rename to clang-tools-extra/clang-tidy/modernize/AvoidSetjmpLongjmpCheck.cpp index d6be7ece24358..fbcde0a8bbd19 100644 --- a/clang-tools-extra/clang-tidy/bugprone/AvoidSetjmpLongjmpCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/AvoidSetjmpLongjmpCheck.cpp @@ -15,7 +15,7 @@ using namespace clang::ast_matchers; -namespace clang::tidy::bugprone { +namespace clang::tidy::modernize { namespace { const char DiagWording[] = @@ -62,4 +62,4 @@ void AvoidSetjmpLongjmpCheck::check(const MatchFinder::MatchResult &Result) { diag(E->getExprLoc(), DiagWording) << cast(E->getCalleeDecl()); } -} // namespace clang::tidy::bugprone +} // namespace clang::tidy::modernize diff --git a/clang-tools-extra/clang-tidy/bugprone/AvoidSetjmpLongjmpCheck.h b/clang-tools-extra/clang-tidy/modernize/AvoidSetjmpLongjmpCheck.h similarity index 73% rename from clang-tools-extra/clang-tidy/bugprone/AvoidSetjmpLongjmpCheck.h rename to clang-tools-extra/clang-tidy/modernize/AvoidSetjmpLongjmpCheck.h index c317f9434729f..23a1cd169e152 100644 --- a/clang-tools-extra/clang-tidy/bugprone/AvoidSetjmpLongjmpCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/AvoidSetjmpLongjmpCheck.h @@ -6,17 +6,17 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_AVOIDSETJMPLONGJMPCHECK_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_AVOIDSETJMPLONGJMPCHECK_H +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_AVOIDSETJMPLONGJMPCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_AVOIDSETJMPLONGJMPCHECK_H #include "../ClangTidyCheck.h" -namespace clang::tidy::bugprone { +namespace clang::tidy::modernize { /// Guards against use of setjmp/longjmp in C++ code /// /// For the user-facing documentation see: -/// http://clang.llvm.org/extra/clang-tidy/checks/bugprone/avoid-setjmp-longjmp.html +/// http://clang.llvm.org/extra/clang-tidy/checks/modernize/avoid-setjmp-longjmp.html class AvoidSetjmpLongjmpCheck : public ClangTidyCheck { public: AvoidSetjmpLongjmpCheck(StringRef Name, ClangTidyContext *Context) @@ -30,6 +30,6 @@ class AvoidSetjmpLongjmpCheck : public ClangTidyCheck { Preprocessor *ModuleExpanderPP) override; }; -} // namespace clang::tidy::bugprone +} // namespace clang::tidy::modernize -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_AVOIDSETJMPLONGJMPCHECK_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_AVOIDSETJMPLONGJMPCHECK_H diff --git a/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt b/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt index bee6bb2b1d5df..882f2dc9fb4d8 100644 --- a/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/modernize/CMakeLists.txt @@ -6,6 +6,7 @@ set(LLVM_LINK_COMPONENTS add_clang_library(clangTidyModernizeModule STATIC AvoidBindCheck.cpp AvoidCArraysCheck.cpp + AvoidSetjmpLongjmpCheck.cpp AvoidVariadicFunctionsCheck.cpp ConcatNestedNamespacesCheck.cpp DeprecatedHeadersCheck.cpp diff --git a/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp b/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp index 244b819f5fe50..360e2b8434d0c 100644 --- a/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/modernize/ModernizeTidyModule.cpp @@ -11,6 +11,7 @@ #include "../ClangTidyModuleRegistry.h" #include "AvoidBindCheck.h" #include "AvoidCArraysCheck.h" +#include "AvoidSetjmpLongjmpCheck.h" #include "AvoidVariadicFunctionsCheck.h" #include "ConcatNestedNamespacesCheck.h" #include "DeprecatedHeadersCheck.h" @@ -64,6 +65,8 @@ class ModernizeModule : public ClangTidyModule { void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { CheckFactories.registerCheck("modernize-avoid-bind"); CheckFactories.registerCheck("modernize-avoid-c-arrays"); + CheckFactories.registerCheck( + "modernize-avoid-setjmp-longjmp"); CheckFactories.registerCheck( "modernize-avoid-variadic-functions"); CheckFactories.registerCheck( diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 64a514da4e9d6..bc916396a14ca 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -217,8 +217,8 @@ New check aliases keeping initial check as an alias to the new one. - Renamed :doc:`cert-err52-cpp ` to - :doc:`bugprone-avoid-setjmp-longjmp - ` + :doc:`modernize-avoid-setjmp-longjmp + ` keeping initial check as an alias to the new one. - Renamed :doc:`cert-err58-cpp ` to diff --git a/clang-tools-extra/docs/clang-tidy/checks/cert/err52-cpp.rst b/clang-tools-extra/docs/clang-tidy/checks/cert/err52-cpp.rst index 000ebc3ce6a89..2f5da1a105b3e 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/cert/err52-cpp.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/cert/err52-cpp.rst @@ -4,5 +4,9 @@ cert-err52-cpp ============== The cert-err52-cpp check is an alias, please see -`bugprone-avoid-setjmp-longjmp <../bugprone/avoid-setjmp-longjmp.html>`_ +`modernize-avoid-setjmp-longjmp <../modernize/avoid-setjmp-longjmp.html>`_ for more information. + +This check corresponds to the CERT C++ Coding Standard rule +`ERR52-CPP. Do not use setjmp() or longjmp() +`_. diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index f310db3870de4..472d509101cdb 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -80,7 +80,6 @@ Clang-Tidy Checks :doc:`bugprone-argument-comment `, "Yes" :doc:`bugprone-assert-side-effect `, :doc:`bugprone-assignment-in-if-condition `, - :doc:`bugprone-avoid-setjmp-longjmp `, :doc:`bugprone-bad-signal-to-kill-thread `, :doc:`bugprone-bitwise-pointer-cast `, :doc:`bugprone-bool-pointer-implicit-conversion `, "Yes" @@ -287,6 +286,7 @@ Clang-Tidy Checks :doc:`misc-use-internal-linkage `, "Yes" :doc:`modernize-avoid-bind `, "Yes" :doc:`modernize-avoid-c-arrays `, + :doc:`modernize-avoid-setjmp-longjmp `, :doc:`modernize-avoid-variadic-functions `, :doc:`modernize-concat-nested-namespaces `, "Yes" :doc:`modernize-deprecated-headers `, "Yes" @@ -441,7 +441,7 @@ Check aliases :doc:`cert-dcl59-cpp `, :doc:`google-build-namespaces `, :doc:`cert-err09-cpp `, :doc:`misc-throw-by-value-catch-by-reference `, :doc:`cert-err34-c `, :doc:`bugprone-unchecked-string-to-number-conversion `, - :doc:`cert-err52-cpp `, :doc:`bugprone-avoid-setjmp-longjmp `, + :doc:`cert-err52-cpp `, :doc:`modernize-avoid-setjmp-longjmp `, :doc:`cert-err58-cpp `, :doc:`bugprone-throwing-static-initialization `, :doc:`cert-err61-cpp `, :doc:`misc-throw-by-value-catch-by-reference `, :doc:`cert-exp42-c `, :doc:`bugprone-suspicious-memory-comparison `, diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/avoid-setjmp-longjmp.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst similarity index 69% rename from clang-tools-extra/docs/clang-tidy/checks/bugprone/avoid-setjmp-longjmp.rst rename to clang-tools-extra/docs/clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst index e3229d82767e2..9748d2bdf3be7 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/bugprone/avoid-setjmp-longjmp.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst @@ -1,7 +1,7 @@ -.. title:: clang-tidy - bugprone-avoid-setjmp-longjmp +.. title:: clang-tidy - modernize-avoid-setjmp-longjmp -bugprone-avoid-setjmp-longjmp -============================= +modernize-avoid-setjmp-longjmp +============================== Flags all call expressions involving ``setjmp()`` and ``longjmp()``. diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/avoid-setjmp-longjmp.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/avoid-setjmp-longjmp.cpp similarity index 83% rename from clang-tools-extra/test/clang-tidy/checkers/bugprone/avoid-setjmp-longjmp.cpp rename to clang-tools-extra/test/clang-tidy/checkers/modernize/avoid-setjmp-longjmp.cpp index 751ad005db102..cb5ac8df56bf6 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/avoid-setjmp-longjmp.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/avoid-setjmp-longjmp.cpp @@ -1,4 +1,4 @@ -// RUN: %check_clang_tidy %s bugprone-avoid-setjmp-longjmp %t +// RUN: %check_clang_tidy %s modernize-avoid-setjmp-longjmp %t typedef void *jmp_buf; extern int __setjmpimpl(jmp_buf); @@ -13,7 +13,7 @@ using ::longjmp; static jmp_buf env; void g() { std::longjmp(env, 1); - // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not call 'longjmp'; consider using exception handling instead [bugprone-avoid-setjmp-longjmp] + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not call 'longjmp'; consider using exception handling instead [modernize-avoid-setjmp-longjmp] ::longjmp(env, 1); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not call 'longjmp'; consider using exception handling instead longjmp(env, 1); From 091f302ac29793df194a014d3b250d73cc26c2e6 Mon Sep 17 00:00:00 2001 From: mtx Date: Mon, 22 Sep 2025 18:17:40 +0800 Subject: [PATCH 3/4] Fix the docs --- clang-tools-extra/docs/clang-tidy/checks/cert/err52-cpp.rst | 2 +- .../clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/docs/clang-tidy/checks/cert/err52-cpp.rst b/clang-tools-extra/docs/clang-tidy/checks/cert/err52-cpp.rst index 2f5da1a105b3e..144d209b356d7 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/cert/err52-cpp.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/cert/err52-cpp.rst @@ -3,7 +3,7 @@ cert-err52-cpp ============== -The cert-err52-cpp check is an alias, please see +The `cert-err52-cpp` check is an alias, please see `modernize-avoid-setjmp-longjmp <../modernize/avoid-setjmp-longjmp.html>`_ for more information. diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst index 9748d2bdf3be7..99e254dd086d8 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst @@ -3,7 +3,10 @@ modernize-avoid-setjmp-longjmp ============================== -Flags all call expressions involving ``setjmp()`` and ``longjmp()``. +Flags all call expressions involving ``setjmp()`` and ``longjmp()`` in C++ code. + +References +---------- This check corresponds to the CERT C++ Coding Standard rule `ERR52-CPP. Do not use setjmp() or longjmp() From e75ab2199a8ee1e4083903b60fcb01b646627294 Mon Sep 17 00:00:00 2001 From: mtx Date: Mon, 22 Sep 2025 19:12:06 +0800 Subject: [PATCH 4/4] Fix instructions in docs --- .../docs/clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clang-tools-extra/docs/clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst index 99e254dd086d8..ae45619a01945 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst @@ -5,6 +5,8 @@ modernize-avoid-setjmp-longjmp Flags all call expressions involving ``setjmp()`` and ``longjmp()`` in C++ code. +Exception handling with ``throw`` and ``catch`` should be used instead. + References ----------