diff --git a/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.cpp index 3e1188d5e246..43a352e389f6 100644 --- a/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/BadSignalToKillThreadCheck.cpp @@ -38,9 +38,15 @@ void BadSignalToKillThreadCheck::check(const MatchFinder::MatchResult &Result) { return std::nullopt; const MacroInfo *MI = PP->getMacroInfo(It->first); const Token &T = MI->tokens().back(); - if (!T.isLiteral() || !T.getLiteralData()) + + if (!T.isLiteral()) + return std::nullopt; + + SmallVector Buffer; + bool Invalid = false; + const StringRef ValueStr = PP->getSpelling(T, Buffer, &Invalid); + if (Invalid) return std::nullopt; - const StringRef ValueStr = StringRef(T.getLiteralData(), T.getLength()); llvm::APInt IntValue; constexpr unsigned AutoSenseRadix = 0; diff --git a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp index f9ff6f21009f..84ceddbd4fc4 100644 --- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp +++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp @@ -823,6 +823,25 @@ TEST(DiagnosticTest, ClangTidyNoLiteralDataInMacroToken) { EXPECT_THAT(TU.build().getDiagnostics(), UnorderedElementsAre()); // no-crash } +TEST(DiagnosticTest, BadSignalToKillThreadInPreamble) { + Annotations Main(R"cpp( + #include "signal.h" + using pthread_t = int; + int pthread_kill(pthread_t thread, int sig); + int func() { + pthread_t thread; + return pthread_kill(thread, 15); + } + )cpp"); + TestTU TU = TestTU::withCode(Main.code()); + TU.HeaderFilename = "signal.h"; + TU.HeaderCode = "#define SIGTERM 15"; + TU.ClangTidyProvider = addTidyChecks("bugprone-bad-signal-to-kill-thread"); + EXPECT_THAT(TU.build().getDiagnostics(), + ifTidyChecks(UnorderedElementsAre( + diagName("bugprone-bad-signal-to-kill-thread")))); +} + TEST(DiagnosticTest, ClangTidyMacroToEnumCheck) { Annotations Main(R"cpp( #if 1 diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index e7437e62ee77..36626d7c1a9b 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -144,6 +144,10 @@ Changes in existing checks ` to also check for C++11 inherited constructors. +- Improved :doc:`bugprone-bad-signal-to-kill-thread + ` check by fixing false + negatives when the ``SIGTERM`` macro is obtained from a precompiled header. + - Improved :doc:`bugprone-exception-escape ` check by adding `TreatFunctionsWithoutSpecificationAsThrowing` option to support reporting