[clang-tools-extra] 4edf0cb - [clang-tidy] Add bugprone-bad-signal-to-kill-thread checker and alias cert-pos44-c

Abel Kocsis via cfe-commits cfe-commits at lists.llvm.org
Mon Nov 11 08:27:51 PST 2019


Author: Abel Kocsis
Date: 2019-11-11T17:26:44+01:00
New Revision: 4edf0cb0e03e31d468979d0d7dec08bd9f4f8204

URL: https://github.com/llvm/llvm-project/commit/4edf0cb0e03e31d468979d0d7dec08bd9f4f8204
DIFF: https://github.com/llvm/llvm-project/commit/4edf0cb0e03e31d468979d0d7dec08bd9f4f8204.diff

LOG: [clang-tidy] Add bugprone-bad-signal-to-kill-thread checker and alias cert-pos44-c

Added: 
    bad-signal-to-kill-thread.patch
    clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.cpp
    clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.h
    clang-tools-extra/docs/clang-tidy/checks/bugprone-bad-signal-to-kill-thread.rst
    clang-tools-extra/docs/clang-tidy/checks/cert-pos44-c.rst
    clang-tools-extra/test/clang-tidy/bugprone-bad-signal-to-kill-thread.cpp

Modified: 
    clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
    clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
    clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
    clang-tools-extra/docs/ReleaseNotes.rst
    clang-tools-extra/docs/clang-tidy/checks/list.rst

Removed: 
    


################################################################################
diff  --git a/bad-signal-to-kill-thread.patch b/bad-signal-to-kill-thread.patch
new file mode 100644
index 000000000000..39b17574646d
--- /dev/null
+++ b/bad-signal-to-kill-thread.patch
@@ -0,0 +1,1133 @@
+
diff  --git a/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.cpp
+new file mode 100644
+index 00000000000..1f3dec497c0
+--- /dev/null
++++ b/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.cpp
+@@ -0,0 +1,70 @@
++//===--- BadSignalToKillThreadCheck.cpp - clang-tidy ---------------------===//
++//
++// 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 "BadSignalToKillThreadCheck.h"
++#include "clang/AST/ASTContext.h"
++#include "clang/ASTMatchers/ASTMatchFinder.h"
++
++using namespace clang::ast_matchers;
++
++namespace clang {
++namespace tidy {
++namespace bugprone {
++
++void BadSignalToKillThreadCheck::registerMatchers(MatchFinder *Finder) {
++  Finder->addMatcher(
++      callExpr(allOf(callee(functionDecl(hasName("::pthread_kill"))),
++                     argumentCountIs(2)),
++               hasArgument(1, integerLiteral().bind("integer-literal")))
++          .bind("thread-kill"),
++      this);
++}
++
++static Preprocessor *PP;
++
++void BadSignalToKillThreadCheck::check(const MatchFinder::MatchResult &Result) {
++  const auto IsSigterm = [](const auto &KeyValue) -> bool {
++    return KeyValue.first->getName() == "SIGTERM";
++  };
++  const auto TryExpandAsInteger =
++      [](Preprocessor::macro_iterator It) -> Optional<unsigned> {
++    if (It == PP->macro_end())
++      return llvm::None;
++    const MacroInfo *MI = PP->getMacroInfo(It->first);
++    const Token &T = MI->tokens().back();
++    StringRef ValueStr = StringRef(T.getLiteralData(), T.getLength());
++
++    llvm::APInt IntValue;
++    constexpr unsigned AutoSenseRadix = 0;
++    if (ValueStr.getAsInteger(AutoSenseRadix, IntValue))
++      return llvm::None;
++    return IntValue.getZExtValue();
++  };
++
++  const auto SigtermMacro = llvm::find_if(PP->macros(), IsSigterm);
++
++  if (!SigtermValue && !(SigtermValue = TryExpandAsInteger(SigtermMacro)))
++    return;
++
++  const auto *MatchedExpr = Result.Nodes.getNodeAs<Expr>("thread-kill");
++  const auto *MatchedIntLiteral =
++      Result.Nodes.getNodeAs<IntegerLiteral>("integer-literal");
++  if (MatchedIntLiteral->getValue() == *SigtermValue) {
++    diag(MatchedExpr->getBeginLoc(),
++         "thread should not be terminated by raising the 'SIGTERM' signal");
++  }
++}
++
++void BadSignalToKillThreadCheck::registerPPCallbacks(
++    const SourceManager &SM, Preprocessor *pp, Preprocessor *ModuleExpanderPP) {
++  PP = pp;
++}
++
++} // namespace bugprone
++} // namespace tidy
++} // namespace clang
+
diff  --git a/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.h b/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.h
+new file mode 100644
+index 00000000000..d39fdec2e7d
+--- /dev/null
++++ b/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.h
+@@ -0,0 +1,37 @@
++//===--- BadSignalToKillThreadCheck.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_BUGPRONE_BADSIGNALTOKILLTHREADCHECK_H
++#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_BADSIGNALTOKILLTHREADCHECK_H
++
++#include "../ClangTidyCheck.h"
++
++namespace clang {
++namespace tidy {
++namespace bugprone {
++
++/// Finds ``pthread_kill`` function calls when thread is terminated by
++/// ``SIGTERM`` signal.
++/// For the user-facing documentation see:
++/// http://clang.llvm.org/extra/clang-tidy/checks/bugprone-bad-signal-to-kill-thread.html
++class BadSignalToKillThreadCheck : public ClangTidyCheck {
++public:
++  BadSignalToKillThreadCheck(StringRef Name, ClangTidyContext *Context)
++      : ClangTidyCheck(Name, Context) {}
++  void registerMatchers(ast_matchers::MatchFinder *Finder) override;
++  void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
++  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
++                           Preprocessor *ModuleExpanderPP) override;
++  Optional<unsigned> SigtermValue;
++};
++
++} // namespace bugprone
++} // namespace tidy
++} // namespace clang
++
++#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_BADSIGNALTOKILLTHREADCHECK_H
+
diff  --git a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
+index 074aa7a8ba6..99eff40ebf4 100644
+--- a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
++++ b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
+@@ -1,175 +1,178 @@
+ //===--- BugproneTidyModule.cpp - clang-tidy ------------------------------===//
+ //
+ // 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 "../ClangTidy.h"
+ #include "../ClangTidyModule.h"
+ #include "../ClangTidyModuleRegistry.h"
+ #include "../cppcoreguidelines/NarrowingConversionsCheck.h"
+ #include "ArgumentCommentCheck.h"
+ #include "AssertSideEffectCheck.h"
++#include "BadSignalToKillThreadCheck.h"
+ #include "BoolPointerImplicitConversionCheck.h"
+ #include "BranchCloneCheck.h"
+ #include "CopyConstructorInitCheck.h"
+ #include "DanglingHandleCheck.h"
+ #include "DynamicStaticInitializersCheck.h"
+ #include "ExceptionEscapeCheck.h"
+ #include "FoldInitTypeCheck.h"
+ #include "ForwardDeclarationNamespaceCheck.h"
+ #include "ForwardingReferenceOverloadCheck.h"
+ #include "InaccurateEraseCheck.h"
+ #include "IncorrectRoundingsCheck.h"
+ #include "InfiniteLoopCheck.h"
+ #include "IntegerDivisionCheck.h"
+ #include "LambdaFunctionNameCheck.h"
+ #include "MacroParenthesesCheck.h"
+ #include "MacroRepeatedSideEffectsCheck.h"
+ #include "MisplacedOperatorInStrlenInAllocCheck.h"
+ #include "MisplacedWideningCastCheck.h"
+ #include "MoveForwardingReferenceCheck.h"
+ #include "MultipleStatementMacroCheck.h"
+ #include "NotNullTerminatedResultCheck.h"
+ #include "ParentVirtualCallCheck.h"
+ #include "PosixReturnCheck.h"
+ #include "SizeofContainerCheck.h"
+ #include "SizeofExpressionCheck.h"
+ #include "StringConstructorCheck.h"
+ #include "StringIntegerAssignmentCheck.h"
+ #include "StringLiteralWithEmbeddedNulCheck.h"
+ #include "SuspiciousEnumUsageCheck.h"
+ #include "SuspiciousMemsetUsageCheck.h"
+ #include "SuspiciousMissingCommaCheck.h"
+ #include "SuspiciousSemicolonCheck.h"
+ #include "SuspiciousStringCompareCheck.h"
+ #include "SwappedArgumentsCheck.h"
+ #include "TerminatingContinueCheck.h"
+ #include "ThrowKeywordMissingCheck.h"
+ #include "TooSmallLoopVariableCheck.h"
+ #include "UndefinedMemoryManipulationCheck.h"
+ #include "UndelegatedConstructorCheck.h"
+ #include "UnhandledSelfAssignmentCheck.h"
+ #include "UnusedRaiiCheck.h"
+ #include "UnusedReturnValueCheck.h"
+ #include "UseAfterMoveCheck.h"
+ #include "VirtualNearMissCheck.h"
+ 
+ namespace clang {
+ namespace tidy {
+ namespace bugprone {
+ 
+ class BugproneModule : public ClangTidyModule {
+ public:
+   void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
+     CheckFactories.registerCheck<ArgumentCommentCheck>(
+         "bugprone-argument-comment");
+     CheckFactories.registerCheck<AssertSideEffectCheck>(
+         "bugprone-assert-side-effect");
++    CheckFactories.registerCheck<BadSignalToKillThreadCheck>(
++        "bugprone-bad-signal-to-kill-thread");
+     CheckFactories.registerCheck<BoolPointerImplicitConversionCheck>(
+         "bugprone-bool-pointer-implicit-conversion");
+     CheckFactories.registerCheck<BranchCloneCheck>(
+         "bugprone-branch-clone");
+     CheckFactories.registerCheck<CopyConstructorInitCheck>(
+         "bugprone-copy-constructor-init");
+     CheckFactories.registerCheck<DanglingHandleCheck>(
+         "bugprone-dangling-handle");
+     CheckFactories.registerCheck<DynamicStaticInitializersCheck>(
+         "bugprone-dynamic-static-initializers");
+     CheckFactories.registerCheck<ExceptionEscapeCheck>(
+         "bugprone-exception-escape");
+     CheckFactories.registerCheck<FoldInitTypeCheck>(
+         "bugprone-fold-init-type");
+     CheckFactories.registerCheck<ForwardDeclarationNamespaceCheck>(
+         "bugprone-forward-declaration-namespace");
+     CheckFactories.registerCheck<ForwardingReferenceOverloadCheck>(
+         "bugprone-forwarding-reference-overload");
+     CheckFactories.registerCheck<InaccurateEraseCheck>(
+         "bugprone-inaccurate-erase");
+     CheckFactories.registerCheck<IncorrectRoundingsCheck>(
+         "bugprone-incorrect-roundings");
+     CheckFactories.registerCheck<InfiniteLoopCheck>(
+         "bugprone-infinite-loop");
+     CheckFactories.registerCheck<IntegerDivisionCheck>(
+         "bugprone-integer-division");
+     CheckFactories.registerCheck<LambdaFunctionNameCheck>(
+         "bugprone-lambda-function-name");
+     CheckFactories.registerCheck<MacroParenthesesCheck>(
+         "bugprone-macro-parentheses");
+     CheckFactories.registerCheck<MacroRepeatedSideEffectsCheck>(
+         "bugprone-macro-repeated-side-effects");
+     CheckFactories.registerCheck<MisplacedOperatorInStrlenInAllocCheck>(
+         "bugprone-misplaced-operator-in-strlen-in-alloc");
+     CheckFactories.registerCheck<MisplacedWideningCastCheck>(
+         "bugprone-misplaced-widening-cast");
+     CheckFactories.registerCheck<MoveForwardingReferenceCheck>(
+         "bugprone-move-forwarding-reference");
+     CheckFactories.registerCheck<MultipleStatementMacroCheck>(
+         "bugprone-multiple-statement-macro");
+     CheckFactories.registerCheck<cppcoreguidelines::NarrowingConversionsCheck>(
+         "bugprone-narrowing-conversions");
+     CheckFactories.registerCheck<NotNullTerminatedResultCheck>(
+         "bugprone-not-null-terminated-result");
+     CheckFactories.registerCheck<ParentVirtualCallCheck>(
+         "bugprone-parent-virtual-call");
+     CheckFactories.registerCheck<PosixReturnCheck>(
+         "bugprone-posix-return");
+     CheckFactories.registerCheck<SizeofContainerCheck>(
+         "bugprone-sizeof-container");
+     CheckFactories.registerCheck<SizeofExpressionCheck>(
+         "bugprone-sizeof-expression");
+     CheckFactories.registerCheck<StringConstructorCheck>(
+         "bugprone-string-constructor");
+     CheckFactories.registerCheck<StringIntegerAssignmentCheck>(
+         "bugprone-string-integer-assignment");
+     CheckFactories.registerCheck<StringLiteralWithEmbeddedNulCheck>(
+         "bugprone-string-literal-with-embedded-nul");
+     CheckFactories.registerCheck<SuspiciousEnumUsageCheck>(
+         "bugprone-suspicious-enum-usage");
+     CheckFactories.registerCheck<SuspiciousMemsetUsageCheck>(
+         "bugprone-suspicious-memset-usage");
+     CheckFactories.registerCheck<SuspiciousMissingCommaCheck>(
+         "bugprone-suspicious-missing-comma");
+     CheckFactories.registerCheck<SuspiciousSemicolonCheck>(
+         "bugprone-suspicious-semicolon");
+     CheckFactories.registerCheck<SuspiciousStringCompareCheck>(
+         "bugprone-suspicious-string-compare");
+     CheckFactories.registerCheck<SwappedArgumentsCheck>(
+         "bugprone-swapped-arguments");
+     CheckFactories.registerCheck<TerminatingContinueCheck>(
+         "bugprone-terminating-continue");
+     CheckFactories.registerCheck<ThrowKeywordMissingCheck>(
+         "bugprone-throw-keyword-missing");
+     CheckFactories.registerCheck<TooSmallLoopVariableCheck>(
+         "bugprone-too-small-loop-variable");
+     CheckFactories.registerCheck<UndefinedMemoryManipulationCheck>(
+         "bugprone-undefined-memory-manipulation");
+     CheckFactories.registerCheck<UndelegatedConstructorCheck>(
+         "bugprone-undelegated-constructor");
+     CheckFactories.registerCheck<UnhandledSelfAssignmentCheck>(
+         "bugprone-unhandled-self-assignment");
+     CheckFactories.registerCheck<UnusedRaiiCheck>(
+         "bugprone-unused-raii");
+     CheckFactories.registerCheck<UnusedReturnValueCheck>(
+         "bugprone-unused-return-value");
+     CheckFactories.registerCheck<UseAfterMoveCheck>(
+         "bugprone-use-after-move");
+     CheckFactories.registerCheck<VirtualNearMissCheck>(
+         "bugprone-virtual-near-miss");
+   }
+ };
+ 
+ } // namespace bugprone
+ 
+ // Register the BugproneTidyModule using this statically initialized variable.
+ static ClangTidyModuleRegistry::Add<bugprone::BugproneModule>
+     X("bugprone-module", "Adds checks for bugprone code constructs.");
+ 
+ // This anchor is used to force the linker to link in the generated object file
+ // and thus register the BugproneModule.
+ volatile int BugproneModuleAnchorSource = 0;
+ 
+ } // namespace tidy
+ } // namespace clang
+
diff  --git a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
+index ab3363f4373..4b499e68069 100644
+--- a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
++++ b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
+@@ -1,62 +1,63 @@
+ set(LLVM_LINK_COMPONENTS support)
+ 
+ add_clang_library(clangTidyBugproneModule
+   ArgumentCommentCheck.cpp
+   AssertSideEffectCheck.cpp
++  BadSignalToKillThreadCheck.cpp
+   BoolPointerImplicitConversionCheck.cpp
+   BranchCloneCheck.cpp
+   BugproneTidyModule.cpp
+   CopyConstructorInitCheck.cpp
+   DanglingHandleCheck.cpp
+   DynamicStaticInitializersCheck.cpp
+   ExceptionEscapeCheck.cpp
+   FoldInitTypeCheck.cpp
+   ForwardDeclarationNamespaceCheck.cpp
+   ForwardingReferenceOverloadCheck.cpp
+   InaccurateEraseCheck.cpp
+   IncorrectRoundingsCheck.cpp
+   InfiniteLoopCheck.cpp
+   IntegerDivisionCheck.cpp
+   LambdaFunctionNameCheck.cpp
+   MacroParenthesesCheck.cpp
+   MacroRepeatedSideEffectsCheck.cpp
+   MisplacedOperatorInStrlenInAllocCheck.cpp
+   MisplacedWideningCastCheck.cpp
+   MoveForwardingReferenceCheck.cpp
+   MultipleStatementMacroCheck.cpp
+   NotNullTerminatedResultCheck.cpp
+   ParentVirtualCallCheck.cpp
+   PosixReturnCheck.cpp
+   SizeofContainerCheck.cpp
+   SizeofExpressionCheck.cpp
+   StringConstructorCheck.cpp
+   StringIntegerAssignmentCheck.cpp
+   StringLiteralWithEmbeddedNulCheck.cpp
+   SuspiciousEnumUsageCheck.cpp
+   SuspiciousMemsetUsageCheck.cpp
+   SuspiciousMissingCommaCheck.cpp
+   SuspiciousSemicolonCheck.cpp
+   SuspiciousStringCompareCheck.cpp
+   SwappedArgumentsCheck.cpp
+   TerminatingContinueCheck.cpp
+   ThrowKeywordMissingCheck.cpp
+   TooSmallLoopVariableCheck.cpp
+   UndefinedMemoryManipulationCheck.cpp
+   UndelegatedConstructorCheck.cpp
+   UnhandledSelfAssignmentCheck.cpp
+   UnusedRaiiCheck.cpp
+   UnusedReturnValueCheck.cpp
+   UseAfterMoveCheck.cpp
+   VirtualNearMissCheck.cpp
+ 
+   LINK_LIBS
+   clangAnalysis
+   clangAST
+   clangASTMatchers
+   clangBasic
+   clangLex
+   clangTidy
+   clangTidyCppCoreGuidelinesModule
+   clangTidyUtils
+   clangTooling
+   )
+
diff  --git a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
+index 341968b6fa6..23820446cd1 100644
+--- a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
++++ b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
+@@ -1,108 +1,112 @@
+ //===--- CERTTidyModule.cpp - clang-tidy ----------------------------------===//
+ //
+ // 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 "../ClangTidy.h"
+ #include "../ClangTidyModule.h"
+ #include "../ClangTidyModuleRegistry.h"
+ #include "../bugprone/UnhandledSelfAssignmentCheck.h"
++#include "../bugprone/BadSignalToKillThreadCheck.h"
+ #include "../google/UnnamedNamespaceInHeaderCheck.h"
+ #include "../misc/NewDeleteOverloadsCheck.h"
+ #include "../misc/NonCopyableObjects.h"
+ #include "../misc/StaticAssertCheck.h"
+ #include "../misc/ThrowByValueCatchByReferenceCheck.h"
+ #include "../performance/MoveConstructorInitCheck.h"
+ #include "../readability/UppercaseLiteralSuffixCheck.h"
+ #include "CommandProcessorCheck.h"
+ #include "DontModifyStdNamespaceCheck.h"
+ #include "FloatLoopCounter.h"
+ #include "LimitedRandomnessCheck.h"
+ #include "PostfixOperatorCheck.h"
+ #include "ProperlySeededRandomGeneratorCheck.h"
+ #include "SetLongJmpCheck.h"
+ #include "StaticObjectExceptionCheck.h"
+ #include "StrToNumCheck.h"
+ #include "ThrownExceptionTypeCheck.h"
+ #include "VariadicFunctionDefCheck.h"
+ 
+ namespace clang {
+ namespace tidy {
+ namespace cert {
+ 
+ class CERTModule : public ClangTidyModule {
+ public:
+   void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
+     // C++ checkers
+     // DCL
+     CheckFactories.registerCheck<PostfixOperatorCheck>(
+         "cert-dcl21-cpp");
+     CheckFactories.registerCheck<VariadicFunctionDefCheck>("cert-dcl50-cpp");
+     CheckFactories.registerCheck<misc::NewDeleteOverloadsCheck>(
+         "cert-dcl54-cpp");
+     CheckFactories.registerCheck<DontModifyStdNamespaceCheck>(
+         "cert-dcl58-cpp");
+     CheckFactories.registerCheck<google::build::UnnamedNamespaceInHeaderCheck>(
+         "cert-dcl59-cpp");
+     // OOP
+     CheckFactories.registerCheck<performance::MoveConstructorInitCheck>(
+         "cert-oop11-cpp");
+     CheckFactories.registerCheck<bugprone::UnhandledSelfAssignmentCheck>(
+         "cert-oop54-cpp");
+     // ERR
+     CheckFactories.registerCheck<misc::ThrowByValueCatchByReferenceCheck>(
+         "cert-err09-cpp");
+     CheckFactories.registerCheck<SetLongJmpCheck>("cert-err52-cpp");
+     CheckFactories.registerCheck<StaticObjectExceptionCheck>("cert-err58-cpp");
+     CheckFactories.registerCheck<ThrownExceptionTypeCheck>("cert-err60-cpp");
+     CheckFactories.registerCheck<misc::ThrowByValueCatchByReferenceCheck>(
+         "cert-err61-cpp");
+     // MSC
+     CheckFactories.registerCheck<LimitedRandomnessCheck>("cert-msc50-cpp");
+     CheckFactories.registerCheck<ProperlySeededRandomGeneratorCheck>(
+         "cert-msc51-cpp");
+ 
+     // C checkers
+     // DCL
+     CheckFactories.registerCheck<misc::StaticAssertCheck>("cert-dcl03-c");
+     CheckFactories.registerCheck<readability::UppercaseLiteralSuffixCheck>(
+         "cert-dcl16-c");
+     // ENV
+     CheckFactories.registerCheck<CommandProcessorCheck>("cert-env33-c");
+     // FLP
+     CheckFactories.registerCheck<FloatLoopCounter>("cert-flp30-c");
+     // FIO
+     CheckFactories.registerCheck<misc::NonCopyableObjectsCheck>("cert-fio38-c");
+     // ERR
+     CheckFactories.registerCheck<StrToNumCheck>("cert-err34-c");
+     // MSC
+     CheckFactories.registerCheck<LimitedRandomnessCheck>("cert-msc30-c");
+     CheckFactories.registerCheck<ProperlySeededRandomGeneratorCheck>(
+         "cert-msc32-c");
++    // POS
++    CheckFactories.registerCheck<bugprone::BadSignalToKillThreadCheck>(
++        "cert-pos44-c");
+   }
+ 
+   ClangTidyOptions getModuleOptions() override {
+     ClangTidyOptions Options;
+     ClangTidyOptions::OptionMap &Opts = Options.CheckOptions;
+     Opts["cert-dcl16-c.NewSuffixes"] = "L;LL;LU;LLU";
+     Opts["cert-oop54-cpp.WarnOnlyIfThisHasSuspiciousField"] = "0";
+     return Options;
+   }
+ };
+ 
+ } // namespace cert
+ 
+ // Register the MiscTidyModule using this statically initialized variable.
+ static ClangTidyModuleRegistry::Add<cert::CERTModule>
+     X("cert-module",
+       "Adds lint checks corresponding to CERT secure coding guidelines.");
+ 
+ // This anchor is used to force the linker to link in the generated object file
+ // and thus register the CERTModule.
+ volatile int CERTModuleAnchorSource = 0;
+ 
+ } // namespace tidy
+ } // namespace clang
+
diff  --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
+index fc5336602c8..a009f3e3107 100644
+--- a/clang-tools-extra/docs/ReleaseNotes.rst
++++ b/clang-tools-extra/docs/ReleaseNotes.rst
+@@ -1,159 +1,170 @@
+ ====================================================
+ Extra Clang Tools 10.0.0 (In-Progress) Release Notes
+ ====================================================
+ 
+ .. contents::
+    :local:
+    :depth: 3
+ 
+ Written by the `LLVM Team <https://llvm.org/>`_
+ 
+ .. warning::
+ 
+    These are in-progress notes for the upcoming Extra Clang Tools 10 release.
+    Release notes for previous releases can be found on
+    `the Download Page <https://releases.llvm.org/download.html>`_.
+ 
+ Introduction
+ ============
+ 
+ This document contains the release notes for the Extra Clang Tools, part of the
+ Clang release 10.0.0. Here we describe the status of the Extra Clang Tools in
+ some detail, including major improvements from the previous release and new
+ feature work. All LLVM releases may be downloaded from the `LLVM releases web
+ site <https://llvm.org/releases/>`_.
+ 
+ For more information about Clang or LLVM, including information about
+ the latest release, please see the `Clang Web Site <https://clang.llvm.org>`_ or
+ the `LLVM Web Site <https://llvm.org>`_.
+ 
+ Note that if you are reading this file from a Subversion checkout or the
+ main Clang web page, this document applies to the *next* release, not
+ the current one. To see the release notes for a specific release, please
+ see the `releases page <https://llvm.org/releases/>`_.
+ 
+ What's New in Extra Clang Tools 10.0.0?
+ =======================================
+ 
+ Some of the major new features and improvements to Extra Clang Tools are listed
+ here. Generic improvements to Extra Clang Tools as a whole or to its underlying
+ infrastructure are described first, followed by tool-specific sections.
+ 
+ Major New Features
+ ------------------
+ 
+ ...
+ 
+ Improvements to clangd
+ ----------------------
+ 
+ The improvements are...
+ 
+ Improvements to clang-doc
+ -------------------------
+ 
+ - :doc:`clang-doc <clang-doc>` now generates documentation in HTML format.
+ 
+ Improvements to clang-query
+ ---------------------------
+ 
+ The improvements are...
+ 
+ Improvements to clang-rename
+ ----------------------------
+ 
+ The improvements are...
+ 
+ Improvements to clang-tidy
+ --------------------------
+ 
++- New :doc:`bugprone-bad-signal-to-kill-thread
++  <clang-tidy/checks/bugprone-bad-signal-to-kill-thread>` check.
++
++  Finds ``pthread_kill`` function calls when a thread is terminated by 
++  raising ``SIGTERM`` signal.
++
+ - New :doc:`bugprone-dynamic-static-initializers
+   <clang-tidy/checks/bugprone-dynamic-static-initializers>` check.
+ 
+   Finds instances where variables with static storage are initialized
+   dynamically in header files.
+ 
+ - New :doc:`bugprone-infinite-loop
+   <clang-tidy/checks/bugprone-infinite-loop>` check.
+ 
+   Finds obvious infinite loops (loops where the condition variable is not
+   changed at all).
+ 
+ - New :doc:`bugprone-not-null-terminated-result
+   <clang-tidy/checks/bugprone-not-null-terminated-result>` check
+ 
+   Finds function calls where it is possible to cause a not null-terminated
+   result. Usually the proper length of a string is ``strlen(str) + 1`` or equal
+   length of this expression, because the null terminator needs an extra space.
+   Without the null terminator it can result in undefined behaviour when the
+   string is read.
+ 
++- New alias :doc:`cert-pos44-cpp
++  <clang-tidy/checks/cert-pos44-cpp>` to
++  :doc:`bugprone-bad-signal-to-kill-thread
++  <clang-tidy/checks/bugprone-bad-signal-to-kill-thread>` was added.
++
+ - New :doc:`cppcoreguidelines-init-variables
+   <clang-tidy/checks/cppcoreguidelines-init-variables>` check.
+ 
+ - New :doc:`darwin-dispatch-once-nonstatic
+   <clang-tidy/checks/darwin-dispatch-once-nonstatic>` check.
+ 
+   Finds declarations of ``dispatch_once_t`` variables without static or global
+   storage.
+ 
+ - New :doc:`google-upgrade-googletest-case
+   <clang-tidy/checks/google-upgrade-googletest-case>` check.
+ 
+   Finds uses of deprecated Googletest APIs with names containing ``case`` and
+   replaces them with equivalent APIs with ``suite``.
+ 
+ - New :doc:`linuxkernel-must-use-errs
+   <clang-tidy/checks/linuxkernel-must-use-errs>` check.
+ 
+   Checks Linux kernel code to see if it uses the results from the functions in
+   ``linux/err.h``.
+ 
+ - New :doc:`llvm-prefer-register-over-unsigned
+   <clang-tidy/checks/llvm-prefer-register-over-unsigned>` check.
+ 
+   Finds historical use of ``unsigned`` to hold vregs and physregs and rewrites
+   them to use ``Register``
+ 
+ - New :doc:`objc-missing-hash
+   <clang-tidy/checks/objc-missing-hash>` check.
+ 
+   Finds Objective-C implementations that implement ``-isEqual:`` without also
+   appropriately implementing ``-hash``.
+ 
+ - Improved :doc:`bugprone-posix-return
+   <clang-tidy/checks/bugprone-posix-return>` check.
+ 
+   Now also checks if any calls to ``pthread_*`` functions expect negative return
+   values.
+ 
+ - The 'objc-avoid-spinlock' check was renamed to :doc:`darwin-avoid-spinlock
+   <clang-tidy/checks/darwin-avoid-spinlock>`
+ 
+ Improvements to include-fixer
+ -----------------------------
+ 
+ The improvements are...
+ 
+ Improvements to clang-include-fixer
+ -----------------------------------
+ 
+ The improvements are...
+ 
+ Improvements to modularize
+ --------------------------
+ 
+ The improvements are...
+ 
+ Improvements to pp-trace
+ ------------------------
+ 
+ The improvements are...
+ 
+ Clang-tidy visual studio plugin
+ -------------------------------
+ 
+ The clang-tidy-vs plugin has been removed from clang, as
+ it's no longer maintained. Users should migrate to
+ `Clang Power Tools <https://marketplace.visualstudio.com/items?itemName=caphyon.ClangPowerTools>`_
+ instead.
+
diff  --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone-bad-signal-to-kill-thread.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone-bad-signal-to-kill-thread.rst
+new file mode 100644
+index 00000000000..05f5c936397
+--- /dev/null
++++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone-bad-signal-to-kill-thread.rst
+@@ -0,0 +1,16 @@
++.. title:: clang-tidy - bugprone-bad-signal-to-kill-thread
++
++bugprone-bad-signal-to-kill-thread
++==================================
++
++Finds ``pthread_kill`` function calls when a thread is terminated by 
++raising ``SIGTERM`` signal and the signal kills the entire process, not 
++just the individual thread. Use any signal except ``SIGTERM``.
++
++.. code-block: c++
++
++    pthread_kill(thread, SIGTERM);
++
++This check corresponds to the CERT C Coding Standard rule
++`POS44-C. Do not use signals to terminate threads
++<https://wiki.sei.cmu.edu/confluence/display/c/POS44-C.+Do+not+use+signals+to+terminate+threads>`_.
+
diff  --git a/clang-tools-extra/docs/clang-tidy/checks/cert-pos44-c.rst b/clang-tools-extra/docs/clang-tidy/checks/cert-pos44-c.rst
+new file mode 100644
+index 00000000000..5bc48a685af
+--- /dev/null
++++ b/clang-tools-extra/docs/clang-tidy/checks/cert-pos44-c.rst
+@@ -0,0 +1,9 @@
++.. title:: clang-tidy - cert-pos44-c
++.. meta::
++   :http-equiv=refresh: 5;URL=bugprone-bad-signal-to-kill-thread.html
++
++cert-pos44-c
++============
++
++The cert-pos44-c check is an alias, please see
++`bugprone-bad-signal-to-kill-thread <bugprone-bad-signal-to-kill-thread.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 5d3bedc603b..35567ca3fb0 100644
+--- a/clang-tools-extra/docs/clang-tidy/checks/list.rst
++++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst
+@@ -1,383 +1,385 @@
+ .. title:: clang-tidy - Clang-Tidy Checks
+ 
+ Clang-Tidy Checks
+ =================
+ 
+ .. toctree::
+ 
+    abseil-duration-addition
+    abseil-duration-comparison
+    abseil-duration-conversion-cast
+    abseil-duration-division
+    abseil-duration-factory-float
+    abseil-duration-factory-scale
+    abseil-duration-subtraction
+    abseil-duration-unnecessary-conversion
+    abseil-faster-strsplit-delimiter
+    abseil-no-internal-dependencies
+    abseil-no-namespace
+    abseil-redundant-strcat-calls
+    abseil-str-cat-append
+    abseil-string-find-startswith
+    abseil-time-comparison
+    abseil-time-subtraction
+    abseil-upgrade-duration-conversions
+    android-cloexec-accept
+    android-cloexec-accept4
+    android-cloexec-creat
+    android-cloexec-dup
+    android-cloexec-epoll-create
+    android-cloexec-epoll-create1
+    android-cloexec-fopen
+    android-cloexec-inotify-init
+    android-cloexec-inotify-init1
+    android-cloexec-memfd-create
+    android-cloexec-open
+    android-cloexec-pipe
+    android-cloexec-pipe2
+    android-cloexec-socket
+    android-comparison-in-temp-failure-retry
+    boost-use-to-string
+    bugprone-argument-comment
+    bugprone-assert-side-effect
++   bugprone-bad-signal-to-kill-thread
+    bugprone-bool-pointer-implicit-conversion
+    bugprone-branch-clone
+    bugprone-copy-constructor-init
+    bugprone-dangling-handle
+    bugprone-dynamic-static-initializers
+    bugprone-exception-escape
+    bugprone-fold-init-type
+    bugprone-forward-declaration-namespace
+    bugprone-forwarding-reference-overload
+    bugprone-inaccurate-erase
+    bugprone-incorrect-roundings
+    bugprone-infinite-loop
+    bugprone-integer-division
+    bugprone-lambda-function-name
+    bugprone-macro-parentheses
+    bugprone-macro-repeated-side-effects
+    bugprone-misplaced-operator-in-strlen-in-alloc
+    bugprone-misplaced-widening-cast
+    bugprone-move-forwarding-reference
+    bugprone-multiple-statement-macro
+    bugprone-not-null-terminated-result
+    bugprone-parent-virtual-call
+    bugprone-posix-return
+    bugprone-sizeof-container
+    bugprone-sizeof-expression
+    bugprone-string-constructor
+    bugprone-string-integer-assignment
+    bugprone-string-literal-with-embedded-nul
+    bugprone-suspicious-enum-usage
+    bugprone-suspicious-memset-usage
+    bugprone-suspicious-missing-comma
+    bugprone-suspicious-semicolon
+    bugprone-suspicious-string-compare
+    bugprone-swapped-arguments
+    bugprone-terminating-continue
+    bugprone-throw-keyword-missing
+    bugprone-too-small-loop-variable
+    bugprone-undefined-memory-manipulation
+    bugprone-undelegated-constructor
+    bugprone-unhandled-self-assignment
+    bugprone-unused-raii
+    bugprone-unused-return-value
+    bugprone-use-after-move
+    bugprone-virtual-near-miss
+    cert-dcl03-c (redirects to misc-static-assert) <cert-dcl03-c>
+    cert-dcl16-c (redirects to readability-uppercase-literal-suffix) <cert-dcl16-c>
+    cert-dcl21-cpp
+    cert-dcl50-cpp
+    cert-dcl54-cpp (redirects to misc-new-delete-overloads) <cert-dcl54-cpp>
+    cert-dcl58-cpp
+    cert-dcl59-cpp (redirects to google-build-namespaces) <cert-dcl59-cpp>
+    cert-env33-c
+    cert-err09-cpp (redirects to misc-throw-by-value-catch-by-reference) <cert-err09-cpp>
+    cert-err34-c
+    cert-err52-cpp
+    cert-err58-cpp
+    cert-err60-cpp
+    cert-err61-cpp (redirects to misc-throw-by-value-catch-by-reference) <cert-err61-cpp>
+    cert-fio38-c (redirects to misc-non-copyable-objects) <cert-fio38-c>
+    cert-flp30-c
+    cert-msc30-c (redirects to cert-msc50-cpp) <cert-msc30-c>
+    cert-msc32-c (redirects to cert-msc51-cpp) <cert-msc32-c>
+    cert-msc50-cpp
+    cert-msc51-cpp
+    cert-oop11-cpp (redirects to performance-move-constructor-init) <cert-oop11-cpp>
+    cert-oop54-cpp (redirects to bugprone-unhandled-self-assignment) <cert-oop54-cpp>
++   cert-pos44-c (redirects to bugprone-bad-signal-to-kill-thread) <cert-pos44-c>
+    clang-analyzer-core.CallAndMessage
+    clang-analyzer-core.DivideZero
+    clang-analyzer-core.DynamicTypePropagation
+    clang-analyzer-core.NonNullParamChecker
+    clang-analyzer-core.NullDereference
+    clang-analyzer-core.StackAddressEscape
+    clang-analyzer-core.UndefinedBinaryOperatorResult
+    clang-analyzer-core.VLASize
+    clang-analyzer-core.uninitialized.ArraySubscript
+    clang-analyzer-core.uninitialized.Assign
+    clang-analyzer-core.uninitialized.Branch
+    clang-analyzer-core.uninitialized.CapturedBlockVariable
+    clang-analyzer-core.uninitialized.UndefReturn
+    clang-analyzer-cplusplus.InnerPointer
+    clang-analyzer-cplusplus.Move
+    clang-analyzer-cplusplus.NewDelete
+    clang-analyzer-cplusplus.NewDeleteLeaks
+    clang-analyzer-deadcode.DeadStores
+    clang-analyzer-nullability.NullPassedToNonnull
+    clang-analyzer-nullability.NullReturnedFromNonnull
+    clang-analyzer-nullability.NullableDereferenced
+    clang-analyzer-nullability.NullablePassedToNonnull
+    clang-analyzer-nullability.NullableReturnedFromNonnull
+    clang-analyzer-optin.cplusplus.UninitializedObject
+    clang-analyzer-optin.cplusplus.VirtualCall
+    clang-analyzer-optin.mpi.MPI-Checker
+    clang-analyzer-optin.osx.OSObjectCStyleCast
+    clang-analyzer-optin.osx.cocoa.localizability.EmptyLocalizationContextChecker
+    clang-analyzer-optin.osx.cocoa.localizability.NonLocalizedStringChecker
+    clang-analyzer-optin.performance.GCDAntipattern
+    clang-analyzer-optin.performance.Padding
+    clang-analyzer-optin.portability.UnixAPI
+    clang-analyzer-osx.API
+    clang-analyzer-osx.MIG
+    clang-analyzer-osx.NumberObjectConversion
+    clang-analyzer-osx.OSObjectRetainCount
+    clang-analyzer-osx.ObjCProperty
+    clang-analyzer-osx.SecKeychainAPI
+    clang-analyzer-osx.cocoa.AtSync
+    clang-analyzer-osx.cocoa.AutoreleaseWrite
+    clang-analyzer-osx.cocoa.ClassRelease
+    clang-analyzer-osx.cocoa.Dealloc
+    clang-analyzer-osx.cocoa.IncompatibleMethodTypes
+    clang-analyzer-osx.cocoa.Loops
+    clang-analyzer-osx.cocoa.MissingSuperCall
+    clang-analyzer-osx.cocoa.NSAutoreleasePool
+    clang-analyzer-osx.cocoa.NSError
+    clang-analyzer-osx.cocoa.NilArg
+    clang-analyzer-osx.cocoa.NonNilReturnValue
+    clang-analyzer-osx.cocoa.ObjCGenerics
+    clang-analyzer-osx.cocoa.RetainCount
+    clang-analyzer-osx.cocoa.RunLoopAutoreleaseLeak
+    clang-analyzer-osx.cocoa.SelfInit
+    clang-analyzer-osx.cocoa.SuperDealloc
+    clang-analyzer-osx.cocoa.UnusedIvars
+    clang-analyzer-osx.cocoa.VariadicMethodTypes
+    clang-analyzer-osx.coreFoundation.CFError
+    clang-analyzer-osx.coreFoundation.CFNumber
+    clang-analyzer-osx.coreFoundation.CFRetainRelease
+    clang-analyzer-osx.coreFoundation.containers.OutOfBounds
+    clang-analyzer-osx.coreFoundation.containers.PointerSizedValues
+    clang-analyzer-security.FloatLoopCounter
+    clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling
+    clang-analyzer-security.insecureAPI.UncheckedReturn
+    clang-analyzer-security.insecureAPI.bcmp
+    clang-analyzer-security.insecureAPI.bcopy
+    clang-analyzer-security.insecureAPI.bzero
+    clang-analyzer-security.insecureAPI.getpw
+    clang-analyzer-security.insecureAPI.gets
+    clang-analyzer-security.insecureAPI.mkstemp
+    clang-analyzer-security.insecureAPI.mktemp
+    clang-analyzer-security.insecureAPI.rand
+    clang-analyzer-security.insecureAPI.strcpy
+    clang-analyzer-security.insecureAPI.vfork
+    clang-analyzer-unix.API
+    clang-analyzer-unix.Malloc
+    clang-analyzer-unix.MallocSizeof
+    clang-analyzer-unix.MismatchedDeallocator
+    clang-analyzer-unix.Vfork
+    clang-analyzer-unix.cstring.BadSizeArg
+    clang-analyzer-unix.cstring.NullArg
+    clang-analyzer-valist.CopyToSelf
+    clang-analyzer-valist.Uninitialized
+    clang-analyzer-valist.Unterminated
+    cppcoreguidelines-avoid-c-arrays (redirects to modernize-avoid-c-arrays) <cppcoreguidelines-avoid-c-arrays>
+    cppcoreguidelines-avoid-goto
+    cppcoreguidelines-avoid-magic-numbers (redirects to readability-magic-numbers) <cppcoreguidelines-avoid-magic-numbers>
+    cppcoreguidelines-c-copy-assignment-signature (redirects to misc-unconventional-assign-operator) <cppcoreguidelines-c-copy-assignment-signature>
+    cppcoreguidelines-explicit-virtual-functions (redirects to modernize-use-override) <cppcoreguidelines-explicit-virtual-functions>
+    cppcoreguidelines-init-variables
+    cppcoreguidelines-interfaces-global-init
+    cppcoreguidelines-macro-usage
+    cppcoreguidelines-narrowing-conversions
+    cppcoreguidelines-no-malloc
+    cppcoreguidelines-non-private-member-variables-in-classes (redirects to misc-non-private-member-variables-in-classes) <cppcoreguidelines-non-private-member-variables-in-classes>
+    cppcoreguidelines-owning-memory
+    cppcoreguidelines-pro-bounds-array-to-pointer-decay
+    cppcoreguidelines-pro-bounds-constant-array-index
+    cppcoreguidelines-pro-bounds-pointer-arithmetic
+    cppcoreguidelines-pro-type-const-cast
+    cppcoreguidelines-pro-type-cstyle-cast
+    cppcoreguidelines-pro-type-member-init
+    cppcoreguidelines-pro-type-reinterpret-cast
+    cppcoreguidelines-pro-type-static-cast-downcast
+    cppcoreguidelines-pro-type-union-access
+    cppcoreguidelines-pro-type-vararg
+    cppcoreguidelines-slicing
+    cppcoreguidelines-special-member-functions
+    darwin-avoid-spinlock
+    darwin-dispatch-once-nonstatic
+    fuchsia-default-arguments-calls
+    fuchsia-default-arguments-declarations
+    fuchsia-header-anon-namespaces (redirects to google-build-namespaces) <fuchsia-header-anon-namespaces>
+    fuchsia-multiple-inheritance
+    fuchsia-overloaded-operator
+    fuchsia-restrict-system-includes
+    fuchsia-statically-constructed-objects
+    fuchsia-trailing-return
+    fuchsia-virtual-inheritance
+    google-build-explicit-make-pair
+    google-build-namespaces
+    google-build-using-namespace
+    google-default-arguments
+    google-explicit-constructor
+    google-global-names-in-headers
+    google-objc-avoid-nsobject-new
+    google-objc-avoid-throwing-exception
+    google-objc-function-naming
+    google-objc-global-variable-declaration
+    google-readability-avoid-underscore-in-googletest-name
+    google-readability-braces-around-statements (redirects to readability-braces-around-statements) <google-readability-braces-around-statements>
+    google-readability-casting
+    google-readability-function-size (redirects to readability-function-size) <google-readability-function-size>
+    google-readability-namespace-comments (redirects to llvm-namespace-comment) <google-readability-namespace-comments>
+    google-readability-todo
+    google-runtime-int
+    google-runtime-operator
+    google-runtime-references
+    google-upgrade-googletest-case
+    hicpp-avoid-c-arrays (redirects to modernize-avoid-c-arrays) <hicpp-avoid-c-arrays>
+    hicpp-avoid-goto
+    hicpp-braces-around-statements (redirects to readability-braces-around-statements) <hicpp-braces-around-statements>
+    hicpp-deprecated-headers (redirects to modernize-deprecated-headers) <hicpp-deprecated-headers>
+    hicpp-exception-baseclass
+    hicpp-explicit-conversions (redirects to google-explicit-constructor) <hicpp-explicit-conversions>
+    hicpp-function-size (redirects to readability-function-size) <hicpp-function-size>
+    hicpp-invalid-access-moved (redirects to bugprone-use-after-move) <hicpp-invalid-access-moved>
+    hicpp-member-init (redirects to cppcoreguidelines-pro-type-member-init) <hicpp-member-init>
+    hicpp-move-const-arg (redirects to performance-move-const-arg) <hicpp-move-const-arg>
+    hicpp-multiway-paths-covered
+    hicpp-named-parameter (redirects to readability-named-parameter) <hicpp-named-parameter>
+    hicpp-new-delete-operators (redirects to misc-new-delete-overloads) <hicpp-new-delete-operators>
+    hicpp-no-array-decay (redirects to cppcoreguidelines-pro-bounds-array-to-pointer-decay) <hicpp-no-array-decay>
+    hicpp-no-assembler
+    hicpp-no-malloc (redirects to cppcoreguidelines-no-malloc) <hicpp-no-malloc>
+    hicpp-noexcept-move (redirects to misc-noexcept-moveconstructor) <hicpp-noexcept-move>
+    hicpp-signed-bitwise
+    hicpp-special-member-functions (redirects to cppcoreguidelines-special-member-functions) <hicpp-special-member-functions>
+    hicpp-static-assert (redirects to misc-static-assert) <hicpp-static-assert>
+    hicpp-undelegated-constructor (redirects to bugprone-undelegated-constructor) <hicpp-undelegated-constructor>
+    hicpp-uppercase-literal-suffix (redirects to readability-uppercase-literal-suffix) <hicpp-uppercase-literal-suffix>
+    hicpp-use-auto (redirects to modernize-use-auto) <hicpp-use-auto>
+    hicpp-use-emplace (redirects to modernize-use-emplace) <hicpp-use-emplace>
+    hicpp-use-equals-default (redirects to modernize-use-equals-default) <hicpp-use-equals-default>
+    hicpp-use-equals-delete (redirects to modernize-use-equals-delete) <hicpp-use-equals-delete>
+    hicpp-use-noexcept (redirects to modernize-use-noexcept) <hicpp-use-noexcept>
+    hicpp-use-nullptr (redirects to modernize-use-nullptr) <hicpp-use-nullptr>
+    hicpp-use-override (redirects to modernize-use-override) <hicpp-use-override>
+    hicpp-vararg (redirects to cppcoreguidelines-pro-type-vararg) <hicpp-vararg>
+    linuxkernel-must-use-errs
+    llvm-header-guard
+    llvm-include-order
+    llvm-namespace-comment
+    llvm-prefer-isa-or-dyn-cast-in-conditionals
+    llvm-prefer-register-over-unsigned
+    llvm-twine-local
+    misc-definitions-in-headers
+    misc-misplaced-const
+    misc-new-delete-overloads
+    misc-non-copyable-objects
+    misc-non-private-member-variables-in-classes
+    misc-redundant-expression
+    misc-static-assert
+    misc-throw-by-value-catch-by-reference
+    misc-unconventional-assign-operator
+    misc-uniqueptr-reset-release
+    misc-unused-alias-decls
+    misc-unused-parameters
+    misc-unused-using-decls
+    modernize-avoid-bind
+    modernize-avoid-c-arrays
+    modernize-concat-nested-namespaces
+    modernize-deprecated-headers
+    modernize-deprecated-ios-base-aliases
+    modernize-loop-convert
+    modernize-make-shared
+    modernize-make-unique
+    modernize-pass-by-value
+    modernize-raw-string-literal
+    modernize-redundant-void-arg
+    modernize-replace-auto-ptr
+    modernize-replace-random-shuffle
+    modernize-return-braced-init-list
+    modernize-shrink-to-fit
+    modernize-unary-static-assert
+    modernize-use-auto
+    modernize-use-bool-literals
+    modernize-use-default-member-init
+    modernize-use-emplace
+    modernize-use-equals-default
+    modernize-use-equals-delete
+    modernize-use-nodiscard
+    modernize-use-noexcept
+    modernize-use-nullptr
+    modernize-use-override
+    modernize-use-trailing-return-type
+    modernize-use-transparent-functors
+    modernize-use-uncaught-exceptions
+    modernize-use-using
+    mpi-buffer-deref
+    mpi-type-mismatch
+    objc-avoid-nserror-init
+    objc-forbidden-subclassing
+    objc-missing-hash
+    objc-property-declaration
+    objc-super-self
+    openmp-exception-escape
+    openmp-use-default-none
+    performance-faster-string-find
+    performance-for-range-copy
+    performance-implicit-conversion-in-loop
+    performance-inefficient-algorithm
+    performance-inefficient-string-concatenation
+    performance-inefficient-vector-operation
+    performance-move-const-arg
+    performance-move-constructor-init
+    performance-noexcept-move-constructor
+    performance-type-promotion-in-math-fn
+    performance-unnecessary-copy-initialization
+    performance-unnecessary-value-param
+    portability-simd-intrinsics
+    readability-avoid-const-params-in-decls
+    readability-braces-around-statements
+    readability-const-return-type
+    readability-container-size-empty
+    readability-convert-member-functions-to-static
+    readability-delete-null-pointer
+    readability-deleted-default
+    readability-else-after-return
+    readability-function-size
+    readability-identifier-naming
+    readability-implicit-bool-conversion
+    readability-inconsistent-declaration-parameter-name
+    readability-isolate-declaration
+    readability-magic-numbers
+    readability-misleading-indentation
+    readability-misplaced-array-index
+    readability-named-parameter
+    readability-non-const-parameter
+    readability-redundant-control-flow
+    readability-redundant-declaration
+    readability-redundant-function-ptr-dereference
+    readability-redundant-member-init
+    readability-redundant-preprocessor
+    readability-redundant-smartptr-get
+    readability-redundant-string-cstr
+    readability-redundant-string-init
+    readability-simplify-boolean-expr
+    readability-simplify-subscript-expr
+    readability-static-accessed-through-instance
+    readability-static-definition-in-anonymous-namespace
+    readability-string-compare
+    readability-uniqueptr-delete-release
+    readability-uppercase-literal-suffix
+    zircon-temporary-objects
+
diff  --git a/clang-tools-extra/test/clang-tidy/bugprone-bad-signal-to-kill-thread.cpp b/clang-tools-extra/test/clang-tidy/bugprone-bad-signal-to-kill-thread.cpp
+new file mode 100644
+index 00000000000..5de2001e26b
+--- /dev/null
++++ b/clang-tools-extra/test/clang-tidy/bugprone-bad-signal-to-kill-thread.cpp
+@@ -0,0 +1,38 @@
++// RUN: %check_clang_tidy %s bugprone-bad-signal-to-kill-thread %t
++
++#define SIGTERM 15
++#define SIGINT 2
++using pthread_t = int;
++using pthread_attr_t = int;
++
++int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
++                   void *(*start_routine)(void *), void *arg);
++
++int pthread_kill(pthread_t thread, int sig);
++
++int pthread_cancel(pthread_t thread);
++
++void *test_func_return_a_pointer(void *foo);
++
++int main() {
++  int result;
++  pthread_t thread;
++
++  if ((result = pthread_create(&thread, nullptr, test_func_return_a_pointer, 0)) != 0) {
++  }
++  if ((result = pthread_kill(thread, SIGTERM)) != 0) {
++    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: thread should not be terminated by raising the 'SIGTERM' signal [bugprone-bad-signal-to-kill-thread]
++  }
++
++  //compliant solution
++  if ((result = pthread_cancel(thread)) != 0) {
++  }
++
++  if ((result = pthread_kill(thread, SIGINT)) != 0) {
++  }
++  if ((result = pthread_kill(thread, 0xF)) != 0) {
++    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: thread should not be terminated by raising the 'SIGTERM' signal [bugprone-bad-signal-to-kill-thread]
++  }
++
++  return 0;
++}

diff  --git a/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.cpp
new file mode 100644
index 000000000000..1f3dec497c07
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.cpp
@@ -0,0 +1,70 @@
+//===--- BadSignalToKillThreadCheck.cpp - clang-tidy ---------------------===//
+//
+// 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 "BadSignalToKillThreadCheck.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+
+using namespace clang::ast_matchers;
+
+namespace clang {
+namespace tidy {
+namespace bugprone {
+
+void BadSignalToKillThreadCheck::registerMatchers(MatchFinder *Finder) {
+  Finder->addMatcher(
+      callExpr(allOf(callee(functionDecl(hasName("::pthread_kill"))),
+                     argumentCountIs(2)),
+               hasArgument(1, integerLiteral().bind("integer-literal")))
+          .bind("thread-kill"),
+      this);
+}
+
+static Preprocessor *PP;
+
+void BadSignalToKillThreadCheck::check(const MatchFinder::MatchResult &Result) {
+  const auto IsSigterm = [](const auto &KeyValue) -> bool {
+    return KeyValue.first->getName() == "SIGTERM";
+  };
+  const auto TryExpandAsInteger =
+      [](Preprocessor::macro_iterator It) -> Optional<unsigned> {
+    if (It == PP->macro_end())
+      return llvm::None;
+    const MacroInfo *MI = PP->getMacroInfo(It->first);
+    const Token &T = MI->tokens().back();
+    StringRef ValueStr = StringRef(T.getLiteralData(), T.getLength());
+
+    llvm::APInt IntValue;
+    constexpr unsigned AutoSenseRadix = 0;
+    if (ValueStr.getAsInteger(AutoSenseRadix, IntValue))
+      return llvm::None;
+    return IntValue.getZExtValue();
+  };
+
+  const auto SigtermMacro = llvm::find_if(PP->macros(), IsSigterm);
+
+  if (!SigtermValue && !(SigtermValue = TryExpandAsInteger(SigtermMacro)))
+    return;
+
+  const auto *MatchedExpr = Result.Nodes.getNodeAs<Expr>("thread-kill");
+  const auto *MatchedIntLiteral =
+      Result.Nodes.getNodeAs<IntegerLiteral>("integer-literal");
+  if (MatchedIntLiteral->getValue() == *SigtermValue) {
+    diag(MatchedExpr->getBeginLoc(),
+         "thread should not be terminated by raising the 'SIGTERM' signal");
+  }
+}
+
+void BadSignalToKillThreadCheck::registerPPCallbacks(
+    const SourceManager &SM, Preprocessor *pp, Preprocessor *ModuleExpanderPP) {
+  PP = pp;
+}
+
+} // namespace bugprone
+} // namespace tidy
+} // namespace clang

diff  --git a/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.h b/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.h
new file mode 100644
index 000000000000..d39fdec2e7de
--- /dev/null
+++ b/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.h
@@ -0,0 +1,37 @@
+//===--- BadSignalToKillThreadCheck.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_BUGPRONE_BADSIGNALTOKILLTHREADCHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_BADSIGNALTOKILLTHREADCHECK_H
+
+#include "../ClangTidyCheck.h"
+
+namespace clang {
+namespace tidy {
+namespace bugprone {
+
+/// Finds ``pthread_kill`` function calls when thread is terminated by
+/// ``SIGTERM`` signal.
+/// For the user-facing documentation see:
+/// http://clang.llvm.org/extra/clang-tidy/checks/bugprone-bad-signal-to-kill-thread.html
+class BadSignalToKillThreadCheck : public ClangTidyCheck {
+public:
+  BadSignalToKillThreadCheck(StringRef Name, ClangTidyContext *Context)
+      : ClangTidyCheck(Name, Context) {}
+  void registerMatchers(ast_matchers::MatchFinder *Finder) override;
+  void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
+  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
+                           Preprocessor *ModuleExpanderPP) override;
+  Optional<unsigned> SigtermValue;
+};
+
+} // namespace bugprone
+} // namespace tidy
+} // namespace clang
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_BADSIGNALTOKILLTHREADCHECK_H

diff  --git a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
index 074aa7a8ba6b..99eff40ebf42 100644
--- a/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
@@ -12,6 +12,7 @@
 #include "../cppcoreguidelines/NarrowingConversionsCheck.h"
 #include "ArgumentCommentCheck.h"
 #include "AssertSideEffectCheck.h"
+#include "BadSignalToKillThreadCheck.h"
 #include "BoolPointerImplicitConversionCheck.h"
 #include "BranchCloneCheck.h"
 #include "CopyConstructorInitCheck.h"
@@ -68,6 +69,8 @@ class BugproneModule : public ClangTidyModule {
         "bugprone-argument-comment");
     CheckFactories.registerCheck<AssertSideEffectCheck>(
         "bugprone-assert-side-effect");
+    CheckFactories.registerCheck<BadSignalToKillThreadCheck>(
+        "bugprone-bad-signal-to-kill-thread");
     CheckFactories.registerCheck<BoolPointerImplicitConversionCheck>(
         "bugprone-bool-pointer-implicit-conversion");
     CheckFactories.registerCheck<BranchCloneCheck>(

diff  --git a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
index ab3363f43733..4b499e68069c 100644
--- a/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
+++ b/clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
@@ -3,6 +3,7 @@ set(LLVM_LINK_COMPONENTS support)
 add_clang_library(clangTidyBugproneModule
   ArgumentCommentCheck.cpp
   AssertSideEffectCheck.cpp
+  BadSignalToKillThreadCheck.cpp
   BoolPointerImplicitConversionCheck.cpp
   BranchCloneCheck.cpp
   BugproneTidyModule.cpp

diff  --git a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
index 341968b6fa6b..23820446cd17 100644
--- a/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
@@ -10,6 +10,7 @@
 #include "../ClangTidyModule.h"
 #include "../ClangTidyModuleRegistry.h"
 #include "../bugprone/UnhandledSelfAssignmentCheck.h"
+#include "../bugprone/BadSignalToKillThreadCheck.h"
 #include "../google/UnnamedNamespaceInHeaderCheck.h"
 #include "../misc/NewDeleteOverloadsCheck.h"
 #include "../misc/NonCopyableObjects.h"
@@ -82,6 +83,9 @@ class CERTModule : public ClangTidyModule {
     CheckFactories.registerCheck<LimitedRandomnessCheck>("cert-msc30-c");
     CheckFactories.registerCheck<ProperlySeededRandomGeneratorCheck>(
         "cert-msc32-c");
+    // POS
+    CheckFactories.registerCheck<bugprone::BadSignalToKillThreadCheck>(
+        "cert-pos44-c");
   }
 
   ClangTidyOptions getModuleOptions() override {

diff  --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 40b7aed41784..a94ee3defd1e 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -67,6 +67,12 @@ The improvements are...
 Improvements to clang-tidy
 --------------------------
 
+- New :doc:`bugprone-bad-signal-to-kill-thread
+  <clang-tidy/checks/bugprone-bad-signal-to-kill-thread>` check.
+
+  Finds ``pthread_kill`` function calls when a thread is terminated by 
+  raising ``SIGTERM`` signal.
+
 - New :doc:`bugprone-dynamic-static-initializers
   <clang-tidy/checks/bugprone-dynamic-static-initializers>` check.
 
@@ -88,6 +94,11 @@ Improvements to clang-tidy
   Without the null terminator it can result in undefined behaviour when the
   string is read.
 
+- New alias :doc:`cert-pos44-cpp
+  <clang-tidy/checks/cert-pos44-cpp>` to
+  :doc:`bugprone-bad-signal-to-kill-thread
+  <clang-tidy/checks/bugprone-bad-signal-to-kill-thread>` was added.
+
 - New :doc:`cppcoreguidelines-init-variables
   <clang-tidy/checks/cppcoreguidelines-init-variables>` check.
 

diff  --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone-bad-signal-to-kill-thread.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone-bad-signal-to-kill-thread.rst
new file mode 100644
index 000000000000..05f5c9363973
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone-bad-signal-to-kill-thread.rst
@@ -0,0 +1,16 @@
+.. title:: clang-tidy - bugprone-bad-signal-to-kill-thread
+
+bugprone-bad-signal-to-kill-thread
+==================================
+
+Finds ``pthread_kill`` function calls when a thread is terminated by 
+raising ``SIGTERM`` signal and the signal kills the entire process, not 
+just the individual thread. Use any signal except ``SIGTERM``.
+
+.. code-block: c++
+
+    pthread_kill(thread, SIGTERM);
+
+This check corresponds to the CERT C Coding Standard rule
+`POS44-C. Do not use signals to terminate threads
+<https://wiki.sei.cmu.edu/confluence/display/c/POS44-C.+Do+not+use+signals+to+terminate+threads>`_.

diff  --git a/clang-tools-extra/docs/clang-tidy/checks/cert-pos44-c.rst b/clang-tools-extra/docs/clang-tidy/checks/cert-pos44-c.rst
new file mode 100644
index 000000000000..5bc48a685afd
--- /dev/null
+++ b/clang-tools-extra/docs/clang-tidy/checks/cert-pos44-c.rst
@@ -0,0 +1,9 @@
+.. title:: clang-tidy - cert-pos44-c
+.. meta::
+   :http-equiv=refresh: 5;URL=bugprone-bad-signal-to-kill-thread.html
+
+cert-pos44-c
+============
+
+The cert-pos44-c check is an alias, please see
+`bugprone-bad-signal-to-kill-thread <bugprone-bad-signal-to-kill-thread.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 b499a84fdcfe..9e6e3472d064 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -39,6 +39,7 @@ Clang-Tidy Checks
    boost-use-to-string
    bugprone-argument-comment
    bugprone-assert-side-effect
+   bugprone-bad-signal-to-kill-thread
    bugprone-bool-pointer-implicit-conversion
    bugprone-branch-clone
    bugprone-copy-constructor-init
@@ -105,6 +106,7 @@ Clang-Tidy Checks
    cert-msc51-cpp
    cert-oop11-cpp (redirects to performance-move-constructor-init) <cert-oop11-cpp>
    cert-oop54-cpp (redirects to bugprone-unhandled-self-assignment) <cert-oop54-cpp>
+   cert-pos44-c (redirects to bugprone-bad-signal-to-kill-thread) <cert-pos44-c>
    clang-analyzer-core.CallAndMessage (redirects to https://clang.llvm.org/docs/analyzer/checkers) <clang-analyzer-core.CallAndMessage>
    clang-analyzer-core.DivideZero (redirects to https://clang.llvm.org/docs/analyzer/checkers) <clang-analyzer-core.DivideZero>
    clang-analyzer-core.DynamicTypePropagation

diff  --git a/clang-tools-extra/test/clang-tidy/bugprone-bad-signal-to-kill-thread.cpp b/clang-tools-extra/test/clang-tidy/bugprone-bad-signal-to-kill-thread.cpp
new file mode 100644
index 000000000000..5de2001e26b9
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/bugprone-bad-signal-to-kill-thread.cpp
@@ -0,0 +1,38 @@
+// RUN: %check_clang_tidy %s bugprone-bad-signal-to-kill-thread %t
+
+#define SIGTERM 15
+#define SIGINT 2
+using pthread_t = int;
+using pthread_attr_t = int;
+
+int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
+                   void *(*start_routine)(void *), void *arg);
+
+int pthread_kill(pthread_t thread, int sig);
+
+int pthread_cancel(pthread_t thread);
+
+void *test_func_return_a_pointer(void *foo);
+
+int main() {
+  int result;
+  pthread_t thread;
+
+  if ((result = pthread_create(&thread, nullptr, test_func_return_a_pointer, 0)) != 0) {
+  }
+  if ((result = pthread_kill(thread, SIGTERM)) != 0) {
+    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: thread should not be terminated by raising the 'SIGTERM' signal [bugprone-bad-signal-to-kill-thread]
+  }
+
+  //compliant solution
+  if ((result = pthread_cancel(thread)) != 0) {
+  }
+
+  if ((result = pthread_kill(thread, SIGINT)) != 0) {
+  }
+  if ((result = pthread_kill(thread, 0xF)) != 0) {
+    // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: thread should not be terminated by raising the 'SIGTERM' signal [bugprone-bad-signal-to-kill-thread]
+  }
+
+  return 0;
+}


        


More information about the cfe-commits mailing list