diff --git a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp index c60397384e273..9ba62219afee9 100644 --- a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp @@ -28,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" @@ -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,7 +257,8 @@ 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-err60-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/clang-tidy/cert/SetLongJmpCheck.cpp b/clang-tools-extra/clang-tidy/modernize/AvoidSetjmpLongjmpCheck.cpp similarity index 77% rename from clang-tools-extra/clang-tidy/cert/SetLongJmpCheck.cpp rename to clang-tools-extra/clang-tidy/modernize/AvoidSetjmpLongjmpCheck.cpp index 4f282b2c6b344..fbcde0a8bbd19 100644 --- a/clang-tools-extra/clang-tidy/cert/SetLongJmpCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/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::modernize { 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::modernize diff --git a/clang-tools-extra/clang-tidy/cert/SetLongJmpCheck.h b/clang-tools-extra/clang-tidy/modernize/AvoidSetjmpLongjmpCheck.h similarity index 64% rename from clang-tools-extra/clang-tidy/cert/SetLongJmpCheck.h rename to clang-tools-extra/clang-tidy/modernize/AvoidSetjmpLongjmpCheck.h index ced3d8cd1b316..23a1cd169e152 100644 --- a/clang-tools-extra/clang-tidy/cert/SetLongJmpCheck.h +++ b/clang-tools-extra/clang-tidy/modernize/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_MODERNIZE_AVOIDSETJMPLONGJMPCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_AVOIDSETJMPLONGJMPCHECK_H #include "../ClangTidyCheck.h" -namespace clang::tidy::cert { +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/cert/err52-cpp.html -class SetLongJmpCheck : public ClangTidyCheck { +/// http://clang.llvm.org/extra/clang-tidy/checks/modernize/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::modernize -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_SETLONGJMPCHECK_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 d352f54e2b8dd..bc916396a14ca 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:`modernize-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/cert/err52-cpp.rst b/clang-tools-extra/docs/clang-tidy/checks/cert/err52-cpp.rst index a29dc7bcd3243..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,9 @@ cert-err52-cpp ============== -This check flags all call expressions involving ``setjmp()`` and ``longjmp()``. +The `cert-err52-cpp` check is an alias, please see +`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 2f05b2ee400a7..472d509101cdb 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -175,7 +175,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 `, @@ -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,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:`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/modernize/avoid-setjmp-longjmp.rst b/clang-tools-extra/docs/clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst new file mode 100644 index 0000000000000..ae45619a01945 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/modernize/avoid-setjmp-longjmp.rst @@ -0,0 +1,15 @@ +.. title:: clang-tidy - modernize-avoid-setjmp-longjmp + +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 +---------- + +This check corresponds to the CERT C++ Coding Standard rule +`ERR52-CPP. Do not use setjmp() or longjmp() +`_. diff --git a/clang-tools-extra/test/clang-tidy/checkers/cert/setlongjmp.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/cert/setlongjmp.cpp rename to clang-tools-extra/test/clang-tidy/checkers/modernize/avoid-setjmp-longjmp.cpp index 88d1db35f6b6a..cb5ac8df56bf6 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/cert/setlongjmp.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/avoid-setjmp-longjmp.cpp @@ -1,4 +1,4 @@ -// RUN: %check_clang_tidy %s cert-err52-cpp %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 [cert-err52-cpp] + // 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);