https://github.com/rniwa updated https://github.com/llvm/llvm-project/pull/91103
>From e2dbb580ff7fe1f2db1ad7c81902cb8a8b5a58ed Mon Sep 17 00:00:00 2001 From: Ryosuke Niwa <rn...@webkit.org> Date: Sat, 4 May 2024 20:41:29 -0700 Subject: [PATCH 1/2] [analyzer] Ignore system headers in WebKit checkers. --- .../Checkers/WebKit/UncountedCallArgsChecker.cpp | 3 +++ .../Checkers/WebKit/UncountedLocalVarsChecker.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp index 0f40ecc7ba300..9a178a690ff24 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp @@ -150,6 +150,9 @@ class UncountedCallArgsChecker bool shouldSkipCall(const CallExpr *CE) const { const auto *Callee = CE->getDirectCallee(); + if (BR->getSourceManager().isInSystemHeader(CE->getExprLoc())) + return true; + if (Callee && TFA.isTrivial(Callee)) return true; diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLocalVarsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLocalVarsChecker.cpp index 6036ad58cf253..98a73810b7afc 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLocalVarsChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLocalVarsChecker.cpp @@ -230,6 +230,9 @@ class UncountedLocalVarsChecker if (!V->isLocalVarDecl()) return true; + if (BR->getSourceManager().isInSystemHeader(V->getLocation())) + return true; + return false; } >From 83abd95771468333a213d952593196d400f55ecc Mon Sep 17 00:00:00 2001 From: Ryosuke Niwa <rn...@webkit.org> Date: Tue, 7 May 2024 16:47:02 -0700 Subject: [PATCH 2/2] Add tests. --- .../Checkers/WebKit/mock-system-header.h | 17 +++++++++++++++++ .../Checkers/WebKit/uncounted-local-vars.cpp | 11 +++++++++++ .../Checkers/WebKit/uncounted-members.cpp | 10 ++++++++++ .../Checkers/WebKit/uncounted-obj-arg.cpp | 6 ++++++ 4 files changed, 44 insertions(+) create mode 100644 clang/test/Analysis/Checkers/WebKit/mock-system-header.h diff --git a/clang/test/Analysis/Checkers/WebKit/mock-system-header.h b/clang/test/Analysis/Checkers/WebKit/mock-system-header.h new file mode 100644 index 0000000000000..a1d30957b19cb --- /dev/null +++ b/clang/test/Analysis/Checkers/WebKit/mock-system-header.h @@ -0,0 +1,17 @@ +#pragma clang system_header + +template <typename T, typename CreateFunction> +void callMethod(CreateFunction createFunction) { + createFunction()->method(); +} + +template <typename T, typename CreateFunction> +inline void localVar(CreateFunction createFunction) { + T* obj = createFunction(); + obj->method(); +} + +template <typename T> +struct MemberVariable { + T* obj { nullptr }; +}; diff --git a/clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp b/clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp index 00673e91f471e..8da1dc557a5a3 100644 --- a/clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp +++ b/clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp @@ -1,6 +1,7 @@ // RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncountedLocalVarsChecker -verify %s #include "mock-types.h" +#include "mock-system-header.h" void someFunction(); @@ -187,3 +188,13 @@ void bar() { } } // namespace ignore_for_if + +namespace ignore_system_headers { + +RefCountable *provide_ref_ctnbl(); + +void system_header() { + localVar<RefCountable>(provide_ref_ctnbl); +} + +} // ignore_system_headers diff --git a/clang/test/Analysis/Checkers/WebKit/uncounted-members.cpp b/clang/test/Analysis/Checkers/WebKit/uncounted-members.cpp index 108d5effdd2e8..bca7b3bad3a15 100644 --- a/clang/test/Analysis/Checkers/WebKit/uncounted-members.cpp +++ b/clang/test/Analysis/Checkers/WebKit/uncounted-members.cpp @@ -1,6 +1,7 @@ // RUN: %clang_analyze_cc1 -analyzer-checker=webkit.NoUncountedMemberChecker -verify %s #include "mock-types.h" +#include "mock-system-header.h" namespace members { struct Foo { @@ -50,3 +51,12 @@ namespace ignore_unions { void forceTmplToInstantiate(RefPtr<RefCountable>) {} } + +namespace ignore_system_header { + +void foo(RefCountable* t) { + MemberVariable<RefCountable> var { t }; + var.obj->method(); +} + +} // ignore_system_header diff --git a/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp index 63a68a994a5c6..e75d42b9f1491 100644 --- a/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp +++ b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp @@ -1,6 +1,7 @@ // RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncountedCallArgsChecker -verify %s #include "mock-types.h" +#include "mock-system-header.h" void WTFBreakpointTrap(); void WTFCrashWithInfo(int, const char*, const char*, int); @@ -147,6 +148,7 @@ class RefCounted { void ref() const; void deref() const; + void method(); void someFunction(); int otherFunction(); @@ -399,3 +401,7 @@ void someFunction(const RefCounted&); void test2() { someFunction(*object()); } + +void system_header() { + callMethod<RefCountable>(object); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits