llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-static-analyzer-1 Author: Balázs Benics (steakhal) <details> <summary>Changes</summary> BugSuppression works by traversing the lexical decl context of the decl with issue to record what source ranges should be suppressed by some attribute. It happens so that it uses a DynamicRecursiveASTVisitor, which has a couple of traversal options. Namely: - ShouldVisitTemplateInstantiations - ShouldWalkTypesOfTypeLocs - ShouldVisitImplicitCode - ShouldVisitLambdaBody By default, these have the correct values, except for ShouldVisitTemplateInstantiations. We should traverse template instantiations because that might be where the bug is reported - thus, where we might have a [[clang::suppress]] that we should honor. In this patch I'll explicitly set these traversal options to avoid further confusion. rdar://164646398 --- Full diff: https://github.com/llvm/llvm-project/pull/168954.diff 2 Files Affected: - (modified) clang/lib/StaticAnalyzer/Core/BugSuppression.cpp (+6-1) - (modified) clang/test/Analysis/suppression-attr.cpp (+24-1) ``````````diff diff --git a/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp b/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp index 5b5f9df9cb0dc..a7300b7183590 100644 --- a/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp +++ b/clang/lib/StaticAnalyzer/Core/BugSuppression.cpp @@ -117,7 +117,12 @@ class CacheInitializer : public DynamicRecursiveASTVisitor { } } - CacheInitializer(Ranges &R) : Result(R) {} + CacheInitializer(Ranges &R) : Result(R) { + ShouldVisitTemplateInstantiations = true; + ShouldWalkTypesOfTypeLocs = false; + ShouldVisitImplicitCode = false; + ShouldVisitLambdaBody = true; + } Ranges &Result; }; diff --git a/clang/test/Analysis/suppression-attr.cpp b/clang/test/Analysis/suppression-attr.cpp index 89bc3c47dbd51..9ba56d976fddb 100644 --- a/clang/test/Analysis/suppression-attr.cpp +++ b/clang/test/Analysis/suppression-attr.cpp @@ -1,4 +1,27 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s +// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -verify %s + +void clang_analyzer_warnIfReached(); + +struct Clazz { + template <typename T> + static void templated_memfn(); +}; + +// This must come before the 'templated_memfn' is defined! +static void instantiate() { + Clazz::templated_memfn<int>(); +} + +template <typename T> +void Clazz::templated_memfn() { + // When we report a bug in a function, we traverse the lexical decl context + // of it while looking for suppression attributes to record what source + // ranges should the suppression apply to. + // In the past, that traversal didn't follow template instantiations, only + // primary templates. + [[clang::suppress]] clang_analyzer_warnIfReached(); // no-warning + +} namespace [[clang::suppress]] suppressed_namespace { `````````` </details> https://github.com/llvm/llvm-project/pull/168954 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
