Skip to content

Commit 0f896a2

Browse files
committed
[alpha.webkit.UncountedCallArgsChecker] Allow a variable declaration in a trivial function. (llvm#82291)
1 parent 1cf6604 commit 0f896a2

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,12 @@ class TrivialFunctionAnalysisVisitor
310310
return true;
311311
if (isa<EnumConstantDecl>(decl))
312312
return true;
313-
if (auto *VD = dyn_cast<VarDecl>(decl))
314-
return VD->hasConstantInitialization() && VD->getEvaluatedValue();
313+
if (auto *VD = dyn_cast<VarDecl>(decl)) {
314+
if (VD->hasConstantInitialization() && VD->getEvaluatedValue())
315+
return true;
316+
auto *Init = VD->getInit();
317+
return !Init || Visit(Init);
318+
}
315319
}
316320
return false;
317321
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,8 @@ class RefCounted {
199199
bool trivial23() const { return OptionSet<Flags>::fromRaw(v).contains(Flags::Flag1); }
200200
int trivial24() const { ASSERT(v); return v; }
201201
unsigned trivial25() const { return __c11_atomic_load((volatile _Atomic(unsigned) *)&v, __ATOMIC_RELAXED); }
202+
bool trivial26() { bool hasValue = v; return !hasValue; }
203+
bool trivial27(int v) { bool value; value = v ? 1 : 0; return value; }
202204

203205
static RefCounted& singleton() {
204206
static RefCounted s_RefCounted;
@@ -262,6 +264,15 @@ class RefCounted {
262264
return __c11_atomic_load((volatile _Atomic(unsigned) *)another(), __ATOMIC_RELAXED);
263265
}
264266

267+
void nonTrivial11() {
268+
Number num(0.3);
269+
}
270+
271+
bool nonTrivial12() {
272+
bool val = otherFunction();
273+
return val;
274+
}
275+
265276
unsigned v { 0 };
266277
Number* number { nullptr };
267278
Enum enumValue { Enum::Value1 };
@@ -309,6 +320,8 @@ class UnrelatedClass {
309320
getFieldTrivial().trivial23(); // no-warning
310321
getFieldTrivial().trivial24(); // no-warning
311322
getFieldTrivial().trivial25(); // no-warning
323+
getFieldTrivial().trivial26(); // no-warning
324+
getFieldTrivial().trivial27(5); // no-warning
312325
RefCounted::singleton().trivial18(); // no-warning
313326
RefCounted::singleton().someFunction(); // no-warning
314327

@@ -334,6 +347,10 @@ class UnrelatedClass {
334347
// expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
335348
getFieldTrivial().nonTrivial10();
336349
// expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
350+
getFieldTrivial().nonTrivial11();
351+
// expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
352+
getFieldTrivial().nonTrivial12();
353+
// expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}}
337354
}
338355
};
339356

0 commit comments

Comments
 (0)