Skip to content

Commit 31774b6

Browse files
authored
[analyzer] Treat bitwise_cast, std::addressof, and new as trivial in WebKit checkers. (#91830)
1 parent 575177f commit 31774b6

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

clang/lib/StaticAnalyzer/Checkers/WebKit/PtrTypesSemantics.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,11 @@ class TrivialFunctionAnalysisVisitor
350350
const auto &Name = safeGetName(Callee);
351351

352352
if (Name == "WTFCrashWithInfo" || Name == "WTFBreakpointTrap" ||
353-
Name == "WTFReportAssertionFailure" ||
354-
Name == "compilerFenceForCrash" || Name.find("__builtin") == 0)
353+
Name == "WTFReportAssertionFailure" || Name == "isMainThread" ||
354+
Name == "isMainThreadOrGCThread" || Name == "isMainRunLoop" ||
355+
Name == "isWebThread" || Name == "isUIThread" ||
356+
Name == "compilerFenceForCrash" || Name == "bitwise_cast" ||
357+
Name == "addressof" || Name.find("__builtin") == 0)
355358
return true;
356359

357360
return TrivialFunctionAnalysis::isTrivialImpl(Callee, Cache);
@@ -428,6 +431,8 @@ class TrivialFunctionAnalysisVisitor
428431
return TrivialFunctionAnalysis::isTrivialImpl(CE->getConstructor(), Cache);
429432
}
430433

434+
bool VisitCXXNewExpr(const CXXNewExpr *NE) { return VisitChildren(NE); }
435+
431436
bool VisitImplicitCastExpr(const ImplicitCastExpr *ICE) {
432437
return Visit(ICE->getSubExpr());
433438
}

clang/test/Analysis/Checkers/WebKit/uncounted-obj-arg.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,18 @@ void WTFCrashWithInfo(int line, const char* file, const char* function, int coun
5959
WTFCrashWithInfoImpl(line, file, function, counter, wtfCrashArg(reason));
6060
}
6161

62+
template<typename ToType, typename FromType>
63+
ToType bitwise_cast(FromType from);
64+
65+
template<typename T>
66+
T* addressof(T& arg);
67+
68+
bool isMainThread();
69+
bool isMainThreadOrGCThread();
70+
bool isMainRunLoop();
71+
bool isWebThread();
72+
bool isUIThread();
73+
6274
enum class Flags : unsigned short {
6375
Flag1 = 1 << 0,
6476
Flag2 = 1 << 1,
@@ -234,6 +246,16 @@ class RefCounted {
234246
void trivial38() { v++; if (__builtin_expect(!!(number), 1)) (*number)++; }
235247
int trivial39() { return -v; }
236248
int trivial40() { return v << 2; }
249+
unsigned trivial41() { v = ++s_v; return v; }
250+
unsigned trivial42() { return bitwise_cast<unsigned long>(nullptr); }
251+
Number* trivial43() { return addressof(*number); }
252+
Number* trivial44() { return new Number(1); }
253+
ComplexNumber* trivial45() { return new ComplexNumber(); }
254+
void trivial46() { ASSERT(isMainThread()); }
255+
void trivial47() { ASSERT(isMainThreadOrGCThread()); }
256+
void trivial48() { ASSERT(isMainRunLoop()); }
257+
void trivial49() { ASSERT(isWebThread()); }
258+
void trivial50() { ASSERT(isUIThread()); }
237259

238260
static RefCounted& singleton() {
239261
static RefCounted s_RefCounted;
@@ -312,13 +334,17 @@ class RefCounted {
312334
void nonTrivial16() { complex++; }
313335
ComplexNumber nonTrivial17() { return complex << 2; }
314336
ComplexNumber nonTrivial18() { return +complex; }
337+
ComplexNumber* nonTrivial19() { return new ComplexNumber(complex); }
315338

339+
static unsigned s_v;
316340
unsigned v { 0 };
317341
Number* number { nullptr };
318342
ComplexNumber complex;
319343
Enum enumValue { Enum::Value1 };
320344
};
321345

346+
unsigned RefCounted::s_v = 0;
347+
322348
RefCounted* refCountedObj();
323349

324350
void test()
@@ -377,6 +403,16 @@ class UnrelatedClass {
377403
getFieldTrivial().trivial38(); // no-warning
378404
getFieldTrivial().trivial39(); // no-warning
379405
getFieldTrivial().trivial40(); // no-warning
406+
getFieldTrivial().trivial41(); // no-warning
407+
getFieldTrivial().trivial42(); // no-warning
408+
getFieldTrivial().trivial43(); // no-warning
409+
getFieldTrivial().trivial44(); // no-warning
410+
getFieldTrivial().trivial45(); // no-warning
411+
getFieldTrivial().trivial46(); // no-warning
412+
getFieldTrivial().trivial47(); // no-warning
413+
getFieldTrivial().trivial48(); // no-warning
414+
getFieldTrivial().trivial49(); // no-warning
415+
getFieldTrivial().trivial50(); // no-warning
380416

381417
RefCounted::singleton().trivial18(); // no-warning
382418
RefCounted::singleton().someFunction(); // no-warning
@@ -419,6 +455,8 @@ class UnrelatedClass {
419455
// expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
420456
getFieldTrivial().nonTrivial18();
421457
// expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
458+
getFieldTrivial().nonTrivial19();
459+
// expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
422460
}
423461
};
424462

0 commit comments

Comments
 (0)