diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedCallArgsChecker.cpp index 0f40ecc7ba3000..9a178a690ff24b 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 6036ad58cf253c..98a73810b7afca 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 00000000000000..a1d30957b19cbe --- /dev/null +++ b/clang/test/Analysis/Checkers/WebKit/mock-system-header.h @@ -0,0 +1,17 @@ +#pragma clang system_header + +template +void callMethod(CreateFunction createFunction) { + createFunction()->method(); +} + +template +inline void localVar(CreateFunction createFunction) { + T* obj = createFunction(); + obj->method(); +} + +template +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 00673e91f471ea..8da1dc557a5a3a 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(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 108d5effdd2e8d..bca7b3bad3a155 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) {} } + +namespace ignore_system_header { + +void foo(RefCountable* t) { + MemberVariable 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 63a68a994a5c64..e75d42b9f14915 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(object); +}