abelkocsis updated this revision to Diff 305388.
abelkocsis added a comment.
Some fixes. Needs further improvement
Repository:
rCTE Clang Tools Extra
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D75229/new/
https://reviews.llvm.org/D75229
Files:
clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
clang-tools-extra/clang-tidy/bugprone/SignalInMultithreadedProgramCheck.cpp
clang-tools-extra/clang-tidy/bugprone/SignalInMultithreadedProgramCheck.h
clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
clang-tools-extra/docs/ReleaseNotes.rst
clang-tools-extra/docs/clang-tidy/checks/bugprone-signal-in-multithreaded-program.rst
clang-tools-extra/docs/clang-tidy/checks/cert-con37-c.rst
clang-tools-extra/docs/clang-tidy/checks/list.rst
clang-tools-extra/test/clang-tidy/checkers/bugprone-signal-in-multithreaded-program-config-std_thread.cpp
clang-tools-extra/test/clang-tidy/checkers/bugprone-signal-in-multithreaded-program-config-thrd_create.c
clang-tools-extra/test/clang-tidy/checkers/bugprone-signal-in-multithreaded-program-noconfig-std_thread.cpp
clang-tools-extra/test/clang-tidy/checkers/bugprone-signal-in-multithreaded-program-noconfig-thrd_create.c
Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-signal-in-multithreaded-program-noconfig-thrd_create.c
===================================================================
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone-signal-in-multithreaded-program-noconfig-thrd_create.c
@@ -0,0 +1,36 @@
+// RUN: %check_clang_tidy %s bugprone-signal-in-multithreaded-program %t
+
+typedef unsigned long int thrd_t;
+typedef int (*thrd_start_t)(void *);
+typedef int sig_atomic_t;
+#define SIGUSR1 30
+#define NULL 0
+
+void (*signal(int sig, void (*handler)(int)))(int);
+
+int thrd_create(thrd_t *thr, thrd_start_t func, void *arg) { return 0; };
+enum {
+ thrd_success = 0,
+};
+
+volatile sig_atomic_t flag = 0;
+
+void handler(int signum) {
+ flag = 1;
+}
+
+int func(void *data) {
+ while (!flag) {
+ }
+ return 0;
+}
+
+int main(void) {
+ signal(SIGUSR1, handler);
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: signal function should not be called in a multithreaded program [bugprone-signal-in-multithreaded-program]
+ thrd_t tid;
+
+ if (thrd_success != thrd_create(&tid, func, NULL)) {
+ }
+ return 0;
+}
Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-signal-in-multithreaded-program-noconfig-std_thread.cpp
===================================================================
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone-signal-in-multithreaded-program-noconfig-std_thread.cpp
@@ -0,0 +1,35 @@
+// RUN: %check_clang_tidy %s bugprone-signal-in-multithreaded-program %t
+
+typedef int sig_atomic_t;
+#define SIGUSR1 30
+#define NULL 0
+
+void (*signal(int sig, void (*handler)(int)))(int);
+
+volatile sig_atomic_t flag = 0;
+
+void handler(int signum) {
+ flag = 1;
+}
+
+void threadFunction() {}
+
+namespace std {
+class thread {
+public:
+ thread() noexcept;
+ template <class Function, class... Args>
+ explicit thread(Function &&f, Args &&... args);
+ thread(const thread &) = delete;
+ thread(thread &&) noexcept;
+};
+} // namespace std
+
+int main() {
+ signal(SIGUSR1, handler);
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: signal function should not be called in a multithreaded program [bugprone-signal-in-multithreaded-program]
+
+ std::thread threadObj(threadFunction);
+
+ return 0;
+}
Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-signal-in-multithreaded-program-config-thrd_create.c
===================================================================
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone-signal-in-multithreaded-program-config-thrd_create.c
@@ -0,0 +1,38 @@
+// RUN: %check_clang_tidy %s bugprone-signal-in-multithreaded-program %t \
+// RUN: -config='{CheckOptions: \
+// RUN: [{key: bugprone-signal-in-multithreaded-program.ThreadList, value: "thrd_create"}]}'
+
+typedef unsigned long int thrd_t;
+typedef int (*thrd_start_t)(void *);
+typedef int sig_atomic_t;
+#define SIGUSR1 30
+#define NULL 0
+
+void (*signal(int sig, void (*handler)(int)))(int);
+
+int thrd_create(thrd_t *thr, thrd_start_t func, void *arg) { return 0; };
+enum {
+ thrd_success = 0,
+};
+
+volatile sig_atomic_t flag = 0;
+
+void handler(int signum) {
+ flag = 1;
+}
+
+int func(void *data) {
+ while (!flag) {
+ }
+ return 0;
+}
+
+int main(void) {
+ signal(SIGUSR1, handler);
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: signal function should not be called in a multithreaded program [bugprone-signal-in-multithreaded-program]
+ thrd_t tid;
+
+ if (thrd_success != thrd_create(&tid, func, NULL)) {
+ }
+ return 0;
+}
Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-signal-in-multithreaded-program-config-std_thread.cpp
===================================================================
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone-signal-in-multithreaded-program-config-std_thread.cpp
@@ -0,0 +1,37 @@
+// RUN: %check_clang_tidy %s bugprone-signal-in-multithreaded-program %t \
+// RUN: -config='{CheckOptions: \
+// RUN: [{key: bugprone-signal-in-multithreaded-program.ThreadList, value: "::thread"}]}'
+
+typedef int sig_atomic_t;
+#define SIGUSR1 30
+#define NULL 0
+
+void (*signal(int sig, void (*handler)(int)))(int);
+
+volatile sig_atomic_t flag = 0;
+
+void handler(int signum) {
+ flag = 1;
+}
+
+void threadFunction() {}
+
+namespace std {
+class thread {
+public:
+ thread() noexcept;
+ template <class Function, class... Args>
+ explicit thread(Function &&f, Args &&... args);
+ thread(const thread &) = delete;
+ thread(thread &&) noexcept;
+};
+} // namespace std
+
+int main() {
+ signal(SIGUSR1, handler);
+ // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: signal function should not be called in a multithreaded program [bugprone-signal-in-multithreaded-program]
+
+ std::thread threadObj(threadFunction);
+
+ return 0;
+}
Index: clang-tools-extra/docs/clang-tidy/checks/list.rst
===================================================================
--- clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -74,6 +74,7 @@
`bugprone-parent-virtual-call <bugprone-parent-virtual-call.html>`_, "Yes"
`bugprone-posix-return <bugprone-posix-return.html>`_, "Yes"
`bugprone-reserved-identifier <bugprone-reserved-identifier.html>`_, "Yes"
+ `bugprone-signal-in-multithreaded-program <bugprone-signal-in-multithreaded-program.html>`_,
`bugprone-signed-char-misuse <bugprone-signed-char-misuse.html>`_,
`bugprone-sizeof-container <bugprone-sizeof-container.html>`_,
`bugprone-sizeof-expression <bugprone-sizeof-expression.html>`_,
@@ -98,6 +99,7 @@
`bugprone-unused-return-value <bugprone-unused-return-value.html>`_,
`bugprone-use-after-move <bugprone-use-after-move.html>`_,
`bugprone-virtual-near-miss <bugprone-virtual-near-miss.html>`_, "Yes"
+ `cert-con37-c <cert-con37-c.html>`_,
`cert-dcl21-cpp <cert-dcl21-cpp.html>`_,
`cert-dcl50-cpp <cert-dcl50-cpp.html>`_,
`cert-dcl58-cpp <cert-dcl58-cpp.html>`_,
Index: clang-tools-extra/docs/clang-tidy/checks/cert-con37-c.rst
===================================================================
--- /dev/null
+++ clang-tools-extra/docs/clang-tidy/checks/cert-con37-c.rst
@@ -0,0 +1,10 @@
+.. title:: clang-tidy - cert-con37-c
+.. meta::
+ :http-equiv=refresh: 5;URL=bugprone-signal-in-multithreaded-program.html
+
+cert-con37-c
+============
+
+The cert-con37-c check is an alias, please see
+`bugprone-signal-in-multithreaded-program <bugprone-signal-in-multithreaded-program.html>`_
+for more information.
Index: clang-tools-extra/docs/clang-tidy/checks/bugprone-signal-in-multithreaded-program.rst
===================================================================
--- /dev/null
+++ clang-tools-extra/docs/clang-tidy/checks/bugprone-signal-in-multithreaded-program.rst
@@ -0,0 +1,26 @@
+.. title:: clang-tidy - bugprone-signal-in-multithreaded-program
+
+bugprone-signal-in-multithreaded-program
+========================================
+
+Finds ``signal`` function calls when the program is multithreaded. The
+check considers the analyzed program multithreaded if it finds at least
+one function call of the following: ``thrd_create``, ``std::thread``,
+``boost::thread``, ``pthread_t``.
+
+.. code-block:: c
+
+ signal(SIGUSR1, handler);
+ thrd_t tid;
+
+This check corresponds to the CERT C++ Coding Standard rule
+`CON37-C. Do not call signal() in a multithreaded program
+<https://wiki.sei.cmu.edu/confluence/display/c/CON37-C.+Do+not+call+signal%28%29+in+a+multithreaded+program>`_.
+
+Options
+-------
+
+.. option:: ThreadList
+
+ Semicolon-separated list of fully qualified names of thread call functions.
+ Defaults to ``thrd_create;::thread;boost::thread;pthread_t``.
Index: clang-tools-extra/docs/ReleaseNotes.rst
===================================================================
--- clang-tools-extra/docs/ReleaseNotes.rst
+++ clang-tools-extra/docs/ReleaseNotes.rst
@@ -107,6 +107,14 @@
Checks for usages of identifiers reserved for use by the implementation.
+- New :doc:`bugprone-signal-in-multithreaded-program
+ <clang-tidy/checks/bugprone-signal-in-multithreaded-program>` check.
+
+ Finds ``signal`` function calls when the program is multithreaded. The
+ check considers the analyzed program multithreaded if it finds at least
+ one function call of the following: ``thrd_create``, ``std::thread``,
+ ``boost::thread``, ``pthread_t``.
+
- New :doc:`bugprone-suspicious-include
<clang-tidy/checks/bugprone-suspicious-include>` check.
@@ -172,6 +180,11 @@
:doc:`bugprone-spuriously-wake-up-functions
<clang-tidy/checks/bugprone-spuriously-wake-up-functions>` was added.
+- New alias :doc:`cert-con37-c
+ <clang-tidy/checks/cert-con37-c>` to
+ :doc:`bugprone-signal-in-multithreaded-program
+ <clang-tidy/checks/bugprone-signal-in-multithreaded-program>` was added.
+
- New alias :doc:`cert-con54-cpp
<clang-tidy/checks/cert-con54-cpp>` to
:doc:`bugprone-spuriously-wake-up-functions
Index: clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
===================================================================
--- clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
+++ clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp
@@ -11,6 +11,7 @@
#include "../ClangTidyModuleRegistry.h"
#include "../bugprone/BadSignalToKillThreadCheck.h"
#include "../bugprone/ReservedIdentifierCheck.h"
+#include "../bugprone/SignalInMultithreadedProgramCheck.h"
#include "../bugprone/SignedCharMisuseCheck.h"
#include "../bugprone/SpuriouslyWakeUpFunctionsCheck.h"
#include "../bugprone/UnhandledSelfAssignmentCheck.h"
@@ -43,7 +44,7 @@
class CERTModule : public ClangTidyModule {
public:
void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override {
- // C++ checkers
+ // C++ checks
// CON
CheckFactories.registerCheck<bugprone::SpuriouslyWakeUpFunctionsCheck>(
"cert-con54-cpp");
@@ -84,8 +85,10 @@
CheckFactories.registerCheck<MutatingCopyCheck>(
"cert-oop58-cpp");
- // C checkers
+ // C checks
// CON
+ CheckFactories.registerCheck<bugprone::SignalInMultithreadedProgramCheck>(
+ "cert-con37-c");
CheckFactories.registerCheck<bugprone::SpuriouslyWakeUpFunctionsCheck>(
"cert-con36-c");
// DCL
Index: clang-tools-extra/clang-tidy/bugprone/SignalInMultithreadedProgramCheck.h
===================================================================
--- /dev/null
+++ clang-tools-extra/clang-tidy/bugprone/SignalInMultithreadedProgramCheck.h
@@ -0,0 +1,49 @@
+//===--- SignalInMultithreadedProgramCheck.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_SIGNALINMULTITHREADEDPROGRAMCHECK_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_SIGNALINMULTITHREADEDPROGRAMCHECK_H
+
+#include "../ClangTidyCheck.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include <string>
+#include <vector>
+
+namespace clang {
+namespace tidy {
+namespace bugprone {
+
+/// Finds ``signal`` function calls when the program is multithreaded. The
+/// check considers the analyzed program multithreaded if it finds at least
+/// one function call of the following: ``thrd_create``, ``std::thread``,
+/// ``boost::thread``, ``pthread_t``.
+///
+/// For the user-facing documentation see:
+/// http://clang.llvm.org/extra/clang-tidy/checks/bugprone-signal-in-multithreaded-program.html
+class SignalInMultithreadedProgramCheck : public ClangTidyCheck {
+public:
+ SignalInMultithreadedProgramCheck(StringRef Name, ClangTidyContext *Context)
+ : ClangTidyCheck(Name, Context),
+ ThreadList(Options.get(
+ "ThreadList", "thrd_create;::std::thread;::boost::thread;pthread_t")) {}
+ void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
+ 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;
+
+private:
+ const std::string ThreadList;
+};
+
+} // namespace bugprone
+} // namespace tidy
+} // namespace clang
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_SIGNALINMULTITHREADEDPROGRAMCHECK_H
Index: clang-tools-extra/clang-tidy/bugprone/SignalInMultithreadedProgramCheck.cpp
===================================================================
--- /dev/null
+++ clang-tools-extra/clang-tidy/bugprone/SignalInMultithreadedProgramCheck.cpp
@@ -0,0 +1,73 @@
+//===--- SignalInMultithreadedProgramCheck.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 "SignalInMultithreadedProgramCheck.h"
+#include "../utils/Matchers.h"
+#include "../utils/OptionsUtils.h"
+#include "clang/AST/ASTContext.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/Basic/TargetInfo.h"
+
+using namespace clang::ast_matchers;
+using namespace clang::ast_matchers::internal;
+
+namespace clang {
+namespace tidy {
+namespace bugprone {
+
+static Preprocessor *PP;
+
+Matcher<FunctionDecl> hasAnyListedName(const std::string &FunctionNames) {
+ const std::vector<std::string> NameList =
+ utils::options::parseStringList(FunctionNames);
+ return hasAnyName(std::vector<StringRef>(NameList.begin(), NameList.end()));
+}
+
+void SignalInMultithreadedProgramCheck::storeOptions(
+ ClangTidyOptions::OptionMap &Opts) {
+ Options.store(Opts, "ThreadList", ThreadList);
+}
+
+void SignalInMultithreadedProgramCheck::registerMatchers(MatchFinder *Finder) {
+
+ auto threadCall =
+ anyOf(hasDescendant(callExpr(ignoringImpCasts(hasDescendant(declRefExpr(
+ hasDeclaration(functionDecl(hasAnyListedName(ThreadList)))))))),
+ hasDescendant(varDecl(hasType(recordDecl(hasName("::std::thread")))))
+
+ );
+ Finder->addMatcher(
+ callExpr(
+ ignoringImpCasts(hasDescendant(declRefExpr(hasDeclaration(
+ functionDecl(allOf(hasName("::signal"), parameterCountIs(2),
+ hasParameter(0, hasType(isInteger())))))))),
+ hasAncestor(compoundStmt(threadCall)))
+ .bind("signal"),
+ this);
+}
+
+void SignalInMultithreadedProgramCheck::check(
+ const MatchFinder::MatchResult &Result) {
+ bool IsPosix = PP->isMacroDefined("_POSIX_C_SOURCE") ||
+ Result.Context->getTargetInfo().getTriple().getVendor() ==
+ llvm::Triple::Apple;
+ if (IsPosix)
+ return;
+ const auto *MatchedSignal = Result.Nodes.getNodeAs<CallExpr>("signal");
+ diag(MatchedSignal->getExprLoc(),
+ "signal function should not be called in a multithreaded program");
+}
+
+void SignalInMultithreadedProgramCheck::registerPPCallbacks(
+ const SourceManager &SM, Preprocessor *pp, Preprocessor *ModuleExpanderPP) {
+ PP = pp;
+}
+
+} // namespace bugprone
+} // namespace tidy
+} // namespace clang
Index: clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
+++ clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt
@@ -33,6 +33,7 @@
ParentVirtualCallCheck.cpp
PosixReturnCheck.cpp
ReservedIdentifierCheck.cpp
+ SignalInMultithreadedProgramCheck.cpp
SignedCharMisuseCheck.cpp
SizeofContainerCheck.cpp
SizeofExpressionCheck.cpp
Index: clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
===================================================================
--- clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
+++ clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp
@@ -38,6 +38,7 @@
#include "ParentVirtualCallCheck.h"
#include "PosixReturnCheck.h"
#include "ReservedIdentifierCheck.h"
+#include "SignalInMultithreadedProgramCheck.h"
#include "SignedCharMisuseCheck.h"
#include "SizeofContainerCheck.h"
#include "SizeofExpressionCheck.h"
@@ -128,6 +129,8 @@
"bugprone-posix-return");
CheckFactories.registerCheck<ReservedIdentifierCheck>(
"bugprone-reserved-identifier");
+ CheckFactories.registerCheck<SignalInMultithreadedProgramCheck>(
+ "bugprone-signal-in-multithreaded-program");
CheckFactories.registerCheck<SignedCharMisuseCheck>(
"bugprone-signed-char-misuse");
CheckFactories.registerCheck<SizeofContainerCheck>(
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits