Author: Ryosuke Niwa Date: 2024-05-07T19:10:50-07:00 New Revision: bb01b89cda71fe1594a87f81b3f3c01f66fcac59
URL: https://github.com/llvm/llvm-project/commit/bb01b89cda71fe1594a87f81b3f3c01f66fcac59 DIFF: https://github.com/llvm/llvm-project/commit/bb01b89cda71fe1594a87f81b3f3c01f66fcac59.diff LOG: [analyzer] Ignore system headers in WebKit checkers. (#91103) Added: clang/test/Analysis/Checkers/WebKit/mock-system-header.h Modified: clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLocalVarsChecker.cpp clang/test/Analysis/Checkers/WebKit/uncounted-local-vars.cpp clang/test/Analysis/Checkers/WebKit/uncounted-members.cpp clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp Removed: ################################################################################ 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; } 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