https://github.com/rniwa updated https://github.com/llvm/llvm-project/pull/91830
>From 7773b0635aabeba769c0050e243f26008795d84b Mon Sep 17 00:00:00 2001 From: Ryosuke Niwa <rn...@apple.com> Date: Fri, 10 May 2024 18:42:07 -0700 Subject: [PATCH 1/3] [analyzer] Treat bitwise_cast, std::addressof, and new as trivial in WebKit checkers. --- .../Checkers/WebKit/PtrTypesSemantics.cpp | 7 +++++- .../Checkers/WebKit/uncounted-obj-arg.cpp | 22 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp index 3abfa4cbb295d..23d97819a8bcd 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp @@ -351,7 +351,8 @@ class TrivialFunctionAnalysisVisitor if (Name == "WTFCrashWithInfo" || Name == "WTFBreakpointTrap" || Name == "WTFReportAssertionFailure" || - Name == "compilerFenceForCrash" || Name.find("__builtin") == 0) + Name == "compilerFenceForCrash" || Name == "bitwise_cast" || + Name == "addressof" || Name.find("__builtin") == 0) return true; return TrivialFunctionAnalysis::isTrivialImpl(Callee, Cache); @@ -428,6 +429,10 @@ 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 6ca7677511d73..197b2ee8a7359 100644 --- a/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp +++ b/clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp @@ -47,6 +47,12 @@ void isIntegralOrPointerType(T, Types... types) void WTFCrashWithInfoImpl(int line, const char* file, const char* function, int counter, unsigned long reason); void WTFCrashWithInfo(int line, const char* file, const char* function, int counter); +template<typename ToType, typename FromType> +ToType bitwise_cast(FromType from); + +template<typename T> +T* addressof(T& arg); + template<typename T> ALWAYS_INLINE unsigned long wtfCrashArg(T* arg) { return reinterpret_cast<unsigned long>(arg); } @@ -234,6 +240,11 @@ 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<unsigned long>(nullptr); } + Number* trivial43() { return addressof(*number); } + Number* trivial44() { return new Number(1); } + ComplexNumber* trivial45() { return new ComplexNumber(); } static RefCounted& singleton() { static RefCounted s_RefCounted; @@ -312,13 +323,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 +392,11 @@ 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 RefCounted::singleton().trivial18(); // no-warning RefCounted::singleton().someFunction(); // no-warning @@ -419,6 +439,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}} } }; >From f630c7233926d5512817fbda500d127ebfa0e231 Mon Sep 17 00:00:00 2001 From: Ryosuke Niwa <rn...@apple.com> Date: Fri, 10 May 2024 18:47:36 -0700 Subject: [PATCH 2/3] Fix formatting. --- .../lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp index 23d97819a8bcd..6a6ffa43c1323 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp @@ -429,9 +429,7 @@ class TrivialFunctionAnalysisVisitor return TrivialFunctionAnalysis::isTrivialImpl(CE->getConstructor(), Cache); } - bool VisitCXXNewExpr(const CXXNewExpr* NE) { - return VisitChildren(NE); - } + bool VisitCXXNewExpr(const CXXNewExpr* NE) { return VisitChildren(NE); } bool VisitImplicitCastExpr(const ImplicitCastExpr *ICE) { return Visit(ICE->getSubExpr()); >From 15d17e2b3e342e9a7950f8f8d6297993ec35b040 Mon Sep 17 00:00:00 2001 From: Ryosuke Niwa <rn...@apple.com> Date: Fri, 10 May 2024 18:51:41 -0700 Subject: [PATCH 3/3] Fix formatting 2. --- clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp index 6a6ffa43c1323..cb22de9d11e56 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp @@ -429,7 +429,7 @@ class TrivialFunctionAnalysisVisitor return TrivialFunctionAnalysis::isTrivialImpl(CE->getConstructor(), Cache); } - bool VisitCXXNewExpr(const CXXNewExpr* NE) { return VisitChildren(NE); } + bool VisitCXXNewExpr(const CXXNewExpr *NE) { return VisitChildren(NE); } bool VisitImplicitCastExpr(const ImplicitCastExpr *ICE) { return Visit(ICE->getSubExpr()); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits