Author: Chris Hamilton Date: 2021-04-23T12:07:14-05:00 New Revision: cae3b70cebc1b7b762a8b466cafca2d4189e72a7
URL: https://github.com/llvm/llvm-project/commit/cae3b70cebc1b7b762a8b466cafca2d4189e72a7 DIFF: https://github.com/llvm/llvm-project/commit/cae3b70cebc1b7b762a8b466cafca2d4189e72a7.diff LOG: [PR49761] Fix variadic arg handling in matcher Mishandling of variadic arguments in a function call caused a crash (runtime assert fail) in bugprone-infinite-loop tidy checker. Fix is to limit argument matching to the lesser of the number of variadic params in the prototype or the number of actual args in the call. Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D101108 Added: Modified: clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp clang/include/clang/ASTMatchers/ASTMatchers.h Removed: ################################################################################ diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp index 8bd4df7cd8445..0b1baf04fee2f 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone-infinite-loop.cpp @@ -386,3 +386,18 @@ void evaluatable(bool CondVar) { do { } while (false && CondVar); } + +struct logger { + void (*debug)(struct logger *, const char *, ...); +}; + +int foo(void) { + struct logger *pl = 0; + int iterator = 0; + while (iterator < 10) { + char *l_tmp_msg = 0; + pl->debug(pl, "%d: %s\n", iterator, l_tmp_msg); + iterator++; + } + return 0; +} diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index 33f57b755941f..fbf98d9f7af07 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -4757,8 +4757,11 @@ AST_POLYMORPHIC_MATCHER_P2(forEachArgumentWithParamType, int ParamIndex = 0; bool Matched = false; + unsigned NumArgs = Node.getNumArgs(); + if (FProto && FProto->isVariadic()) + NumArgs = std::min(NumArgs, FProto->getNumParams()); - for (; ArgIndex < Node.getNumArgs(); ++ArgIndex, ++ParamIndex) { + for (; ArgIndex < NumArgs; ++ArgIndex, ++ParamIndex) { BoundNodesTreeBuilder ArgMatches(*Builder); if (ArgMatcher.matches(*(Node.getArg(ArgIndex)->IgnoreParenCasts()), Finder, &ArgMatches)) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits