Skip to content

Commit 72200fc

Browse files
rniwaRyosuke Niwa
and
Ryosuke Niwa
authored
[analyzer] Check C++ base or member initializer in WebKit checkers. (llvm#92220)
Co-authored-by: Ryosuke Niwa <rniwa@apple.com>
1 parent a9763de commit 72200fc

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,11 +525,19 @@ bool TrivialFunctionAnalysis::isTrivialImpl(
525525
if (!IsNew)
526526
return It->second;
527527

528+
TrivialFunctionAnalysisVisitor V(Cache);
529+
530+
if (auto *CtorDecl = dyn_cast<CXXConstructorDecl>(D)) {
531+
for (auto *CtorInit : CtorDecl->inits()) {
532+
if (!V.Visit(CtorInit->getInit()))
533+
return false;
534+
}
535+
}
536+
528537
const Stmt *Body = D->getBody();
529538
if (!Body)
530539
return false;
531540

532-
TrivialFunctionAnalysisVisitor V(Cache);
533541
bool Result = V.Visit(Body);
534542
if (Result)
535543
Cache[D] = true;

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,13 @@ template<typename E> class OptionSet {
159159
StorageType m_storage { 0 };
160160
};
161161

162+
int atoi(const char* str);
163+
162164
class Number {
163165
public:
164166
Number(int v) : v(v) { }
165167
Number(double);
168+
Number(const char* str) : v(atoi(str)) { }
166169
Number operator+(const Number&);
167170
Number& operator++() { ++v; return *this; }
168171
Number operator++(int) { Number returnValue(v); ++v; return returnValue; }
@@ -173,9 +176,16 @@ class Number {
173176
int v;
174177
};
175178

179+
class DerivedNumber : public Number {
180+
public:
181+
DerivedNumber(char c) : Number(c - '0') { }
182+
DerivedNumber(const char* str) : Number(atoi(str)) { }
183+
};
184+
176185
class ComplexNumber {
177186
public:
178187
ComplexNumber() : realPart(0), complexPart(0) { }
188+
ComplexNumber(int real, const char* str) : realPart(real), complexPart(str) { }
179189
ComplexNumber(const ComplexNumber&);
180190
ComplexNumber& operator++() { realPart.someMethod(); return *this; }
181191
ComplexNumber operator++(int);
@@ -311,6 +321,7 @@ class RefCounted {
311321
return;
312322
}
313323
unsigned trivial60() { return ObjectWithNonTrivialDestructor { 5 }.value(); }
324+
unsigned trivial61() { return DerivedNumber('7').value(); }
314325

315326
static RefCounted& singleton() {
316327
static RefCounted s_RefCounted;
@@ -391,6 +402,9 @@ class RefCounted {
391402
ComplexNumber nonTrivial18() { return +complex; }
392403
ComplexNumber* nonTrivial19() { return new ComplexNumber(complex); }
393404
unsigned nonTrivial20() { return ObjectWithMutatingDestructor { 7 }.value(); }
405+
unsigned nonTrivial21() { return Number("123").value(); }
406+
unsigned nonTrivial22() { return ComplexNumber(123, "456").real().value(); }
407+
unsigned nonTrivial23() { return DerivedNumber("123").value(); }
394408

395409
static unsigned s_v;
396410
unsigned v { 0 };
@@ -479,6 +493,7 @@ class UnrelatedClass {
479493
getFieldTrivial().trivial58(); // no-warning
480494
getFieldTrivial().trivial59(); // no-warning
481495
getFieldTrivial().trivial60(); // no-warning
496+
getFieldTrivial().trivial61(); // no-warning
482497

483498
RefCounted::singleton().trivial18(); // no-warning
484499
RefCounted::singleton().someFunction(); // no-warning
@@ -525,6 +540,12 @@ class UnrelatedClass {
525540
// expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
526541
getFieldTrivial().nonTrivial20();
527542
// expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
543+
getFieldTrivial().nonTrivial21();
544+
// expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
545+
getFieldTrivial().nonTrivial22();
546+
// expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
547+
getFieldTrivial().nonTrivial23();
548+
// expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
528549
}
529550
};
530551

0 commit comments

Comments
 (0)