https://github.com/MaxSanchez99 created https://github.com/llvm/llvm-project/pull/116515
None >From 029c4183c5685ac3047aec9154a593339b206a48 Mon Sep 17 00:00:00 2001 From: Maximino Sanchez Jr <maxsan@DESKTOP-TVMD718.> Date: Sat, 16 Nov 2024 18:35:39 -0600 Subject: [PATCH] Added a PthreadCreateChecker and attempted to register it --- .../clang/StaticAnalyzer/Checkers/Checkers.td | 4 ++ clang/lib/Headers/CMakeLists.txt | 3 +- .../StaticAnalyzer/Checkers/CMakeLists.txt | 1 + .../Checkers/PthreadCreateChecker.cpp | 46 +++++++++++++++++++ clang/test/Analysis/pthreadcreate.c | 31 +++++++++++++ 5 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 clang/lib/StaticAnalyzer/Checkers/PthreadCreateChecker.cpp create mode 100644 clang/test/Analysis/pthreadcreate.c diff --git a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td index b03e707d638742..e7b08b89c358d5 100644 --- a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td +++ b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td @@ -606,6 +606,10 @@ def ChrootChecker : Checker<"Chroot">, HelpText<"Check improper use of chroot">, Documentation<HasDocumentation>; +def PthreadCreateChecker : Checker<"PthreadCreate">, + HelpText<"Check for creation of pthread">, + Documentation<HasDocumentation>; + def PthreadLockChecker : Checker<"PthreadLock">, HelpText<"Simple lock -> unlock checker">, Dependencies<[PthreadLockBase]>, diff --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt index a094305bcec5e4..4154dea674cbbc 100644 --- a/clang/lib/Headers/CMakeLists.txt +++ b/clang/lib/Headers/CMakeLists.txt @@ -379,7 +379,8 @@ set(zos_wrapper_files include(GetClangResourceDir) get_clang_resource_dir(output_dir PREFIX ${LLVM_LIBRARY_OUTPUT_INTDIR}/.. SUBDIR include) -set(out_files) +set(out_files + ../../test/Analysis/pthreadcreate.c) set(generated_files) set(arm_common_generated_files) diff --git a/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt b/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt index f40318f46dea1a..ace537837de5f3 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt +++ b/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt @@ -92,6 +92,7 @@ add_clang_library(clangStaticAnalyzerCheckers PaddingChecker.cpp PointerArithChecker.cpp PointerSubChecker.cpp + PthreadCreateChecker.cpp PthreadLockChecker.cpp PutenvStackArrayChecker.cpp RetainCountChecker/RetainCountChecker.cpp diff --git a/clang/lib/StaticAnalyzer/Checkers/PthreadCreateChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/PthreadCreateChecker.cpp new file mode 100644 index 00000000000000..e9225fb780c867 --- /dev/null +++ b/clang/lib/StaticAnalyzer/Checkers/PthreadCreateChecker.cpp @@ -0,0 +1,46 @@ +// +// Created by MaxSa on 11/13/2024. +// + +#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h" +#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" +#include "clang/StaticAnalyzer/Core/Checker.h" +#include "clang/StaticAnalyzer/Core/CheckerManager.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/CallDescription.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h" + +using namespace clang; +using namespace ento; + +class PthreadCreateChecker : public Checker<check::PostCall> { +public: + void checkPostCall(const CallEvent &Call, CheckerContext &Context) const; + +}; + +void PthreadCreateChecker::checkPostCall(const CallEvent &Call, CheckerContext &Context) const { + const FunctionDecl *FuncID = Call.getDecl()->getAsFunction(); + if (!FuncID) { + return; + } + + if (FuncID->getName() == "pthread_create") { + SVal returnVal = Call.getReturnValue(); + if (returnVal.isZeroConstant()) { + llvm::errs() << "Pthread has been created\n"; + } + } +} + +// Register checker +void ento::registerPthreadCreateChecker(CheckerManager &mgr) { + mgr.registerChecker<PthreadCreateChecker>(); +} + +bool ento::shouldRegisterPthreadCreateChecker(const CheckerManager &mgr) { + return true; +} + + + diff --git a/clang/test/Analysis/pthreadcreate.c b/clang/test/Analysis/pthreadcreate.c new file mode 100644 index 00000000000000..0ca6f13d4ecb45 --- /dev/null +++ b/clang/test/Analysis/pthreadcreate.c @@ -0,0 +1,31 @@ +// +// Created by MaxSa on 11/14/2024. +// + +#include <stdio.h> +#include <stdlib.h> +#include <pthread.h> + + +void* thread_function(void* arg) { + printf("thread_function start\n"); + return nullptr; +} + +int main() { + pthread_t thread; + int arg = 42; + + if (pthread_create(&thread, NULL, thread_function, &arg)) { + perror("pthread_create"); + exit(1); + } + + if (pthread_join(thread, nullptr)) { + perror("pthread_join"); + exit(1); + } + + printf("thread exit\n"); + return 0; +} \ No newline at end of file _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits