diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp index 3abfa4cbb295d8..ad493587affa07 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp @@ -350,8 +350,11 @@ class TrivialFunctionAnalysisVisitor const auto &Name = safeGetName(Callee); if (Name == "WTFCrashWithInfo" || Name == "WTFBreakpointTrap" || - Name == "WTFReportAssertionFailure" || - Name == "compilerFenceForCrash" || Name.find("__builtin") == 0) + Name == "WTFReportAssertionFailure" || Name == "isMainThread" || + Name == "isMainThreadOrGCThread" || Name == "isMainRunLoop" || + Name == "isWebThread" || Name == "isUIThread" || + Name == "compilerFenceForCrash" || Name == "bitwise_cast" || + Name == "addressof" || Name.find("__builtin") == 0) return true; return TrivialFunctionAnalysis::isTrivialImpl(Callee, Cache); @@ -428,6 +431,8 @@ class TrivialFunctionAnalysisVisitor return TrivialFunctionAnalysis::isTrivialImpl(CE->getConstructor(), Cache); } + bool VisitCXXNewExpr(const CXXNewExpr *NE) { return VisitChildren(NE); } + bool VisitImplicitCastExpr(const ImplicitCastExpr *ICE) { return Visit(ICE->getSubExpr()); } diff --git a/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp index 6ca7677511d73f..073f3252160ee6 100644 --- a/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp +++ b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp @@ -59,6 +59,18 @@ void WTFCrashWithInfo(int line, const char* file, const char* function, int coun WTFCrashWithInfoImpl(line, file, function, counter, wtfCrashArg(reason)); } +template +ToType bitwise_cast(FromType from); + +template +T* addressof(T& arg); + +bool isMainThread(); +bool isMainThreadOrGCThread(); +bool isMainRunLoop(); +bool isWebThread(); +bool isUIThread(); + enum class Flags : unsigned short { Flag1 = 1 << 0, Flag2 = 1 << 1, @@ -234,6 +246,16 @@ class RefCounted { void trivial38() { v++; if (__builtin_expect(!!(number), 1)) (*number)++; } int trivial39() { return -v; } int trivial40() { return v << 2; } + unsigned trivial41() { v = ++s_v; return v; } + unsigned trivial42() { return bitwise_cast(nullptr); } + Number* trivial43() { return addressof(*number); } + Number* trivial44() { return new Number(1); } + ComplexNumber* trivial45() { return new ComplexNumber(); } + void trivial46() { ASSERT(isMainThread()); } + void trivial47() { ASSERT(isMainThreadOrGCThread()); } + void trivial48() { ASSERT(isMainRunLoop()); } + void trivial49() { ASSERT(isWebThread()); } + void trivial50() { ASSERT(isUIThread()); } static RefCounted& singleton() { static RefCounted s_RefCounted; @@ -312,13 +334,17 @@ class RefCounted { void nonTrivial16() { complex++; } ComplexNumber nonTrivial17() { return complex << 2; } ComplexNumber nonTrivial18() { return +complex; } + ComplexNumber* nonTrivial19() { return new ComplexNumber(complex); } + static unsigned s_v; unsigned v { 0 }; Number* number { nullptr }; ComplexNumber complex; Enum enumValue { Enum::Value1 }; }; +unsigned RefCounted::s_v = 0; + RefCounted* refCountedObj(); void test() @@ -377,6 +403,16 @@ class UnrelatedClass { getFieldTrivial().trivial38(); // no-warning getFieldTrivial().trivial39(); // no-warning getFieldTrivial().trivial40(); // no-warning + getFieldTrivial().trivial41(); // no-warning + getFieldTrivial().trivial42(); // no-warning + getFieldTrivial().trivial43(); // no-warning + getFieldTrivial().trivial44(); // no-warning + getFieldTrivial().trivial45(); // no-warning + getFieldTrivial().trivial46(); // no-warning + getFieldTrivial().trivial47(); // no-warning + getFieldTrivial().trivial48(); // no-warning + getFieldTrivial().trivial49(); // no-warning + getFieldTrivial().trivial50(); // no-warning RefCounted::singleton().trivial18(); // no-warning RefCounted::singleton().someFunction(); // no-warning @@ -419,6 +455,8 @@ class UnrelatedClass { // expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}} getFieldTrivial().nonTrivial18(); // expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}} + getFieldTrivial().nonTrivial19(); + // expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}} } };