https://github.com/5chmidti updated https://github.com/llvm/llvm-project/pull/113833
>From 99090f44fdfe049d7e01e469787ebb0039b965c4 Mon Sep 17 00:00:00 2001 From: Julian Schmidt <git.julian.schm...@gmail.com> Date: Sun, 27 Oct 2024 20:47:21 +0100 Subject: [PATCH 1/3] [clang-tidy] fix crash in altera-id-dependent-backward-branch Add some checks for `nullptr` and change some `dyn_cast` to `dyn_cast_if_present` to avoid crashes. Fixes #55408 --- .../altera/IdDependentBackwardBranchCheck.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp b/clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp index 09f7d8c5c2f952..94db0a793cf53d 100644 --- a/clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp +++ b/clang-tools-extra/clang-tidy/altera/IdDependentBackwardBranchCheck.cpp @@ -78,16 +78,22 @@ void IdDependentBackwardBranchCheck::registerMatchers(MatchFinder *Finder) { IdDependentBackwardBranchCheck::IdDependencyRecord * IdDependentBackwardBranchCheck::hasIdDepVar(const Expr *Expression) { + if (!Expression) + return nullptr; + if (const auto *Declaration = dyn_cast<DeclRefExpr>(Expression)) { // It is a DeclRefExpr, so check if it's an ID-dependent variable. - const auto *CheckVariable = dyn_cast<VarDecl>(Declaration->getDecl()); + const auto *CheckVariable = + dyn_cast_if_present<VarDecl>(Declaration->getDecl()); + if (!CheckVariable) + return nullptr; auto FoundVariable = IdDepVarsMap.find(CheckVariable); if (FoundVariable == IdDepVarsMap.end()) return nullptr; return &(FoundVariable->second); } for (const auto *Child : Expression->children()) - if (const auto *ChildExpression = dyn_cast<Expr>(Child)) + if (const auto *ChildExpression = dyn_cast_if_present<Expr>(Child)) if (IdDependencyRecord *Result = hasIdDepVar(ChildExpression)) return Result; return nullptr; @@ -95,16 +101,21 @@ IdDependentBackwardBranchCheck::hasIdDepVar(const Expr *Expression) { IdDependentBackwardBranchCheck::IdDependencyRecord * IdDependentBackwardBranchCheck::hasIdDepField(const Expr *Expression) { + if (!Expression) + return nullptr; + if (const auto *MemberExpression = dyn_cast<MemberExpr>(Expression)) { const auto *CheckField = - dyn_cast<FieldDecl>(MemberExpression->getMemberDecl()); + dyn_cast_if_present<FieldDecl>(MemberExpression->getMemberDecl()); + if (!CheckField) + return nullptr; auto FoundField = IdDepFieldsMap.find(CheckField); if (FoundField == IdDepFieldsMap.end()) return nullptr; return &(FoundField->second); } for (const auto *Child : Expression->children()) - if (const auto *ChildExpression = dyn_cast<Expr>(Child)) + if (const auto *ChildExpression = dyn_cast_if_present<Expr>(Child)) if (IdDependencyRecord *Result = hasIdDepField(ChildExpression)) return Result; return nullptr; >From 0db4a08356dbe732be01d2da7564984aa9a5d433 Mon Sep 17 00:00:00 2001 From: Julian Schmidt <git.julian.schm...@gmail.com> Date: Sun, 27 Oct 2024 20:57:06 +0100 Subject: [PATCH 2/3] add release note --- clang-tools-extra/docs/ReleaseNotes.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 876689c40fcdb2..ae75b632a44e5e 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -141,6 +141,10 @@ New check aliases Changes in existing checks ^^^^^^^^^^^^^^^^^^^^^^^^^^ +- Improved :doc:`altera-id-dependent-backward-branch + <clang-tidy/checks/altera/id-dependent-backward-branch>` check by fixing + crashes from invalid code. + - Improved :doc:`bugprone-casting-through-void <clang-tidy/checks/bugprone/casting-through-void>` check to suggest replacing the offending code with ``reinterpret_cast``, to more clearly express intent. >From 9dbea91926409faf1d75347f6ed4050c39c01d28 Mon Sep 17 00:00:00 2001 From: Julian Schmidt <git.julian.schm...@gmail.com> Date: Thu, 31 Oct 2024 09:51:01 +0100 Subject: [PATCH 3/3] add testcase --- .../checkers/altera/id-dependent-backward-branch.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp b/clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp index c0a75fae98d757..6137e6f929dc08 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/altera/id-dependent-backward-branch.cpp @@ -1,4 +1,4 @@ -// RUN: %check_clang_tidy %s altera-id-dependent-backward-branch %t -- -header-filter=.* "--" -cl-std=CL1.2 -c +// RUN: %check_clang_tidy %s altera-id-dependent-backward-branch %t -- -header-filter=.* "--" -cl-std=CLC++1.0 -c void error() { // ==== Conditional Expressions ==== @@ -80,3 +80,9 @@ void success() { } } } + +template<char... STOP> +void gh55408(char const input[], int pos) { + while (((input[pos] != STOP) && ...)); +} + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits