Skip to content

Commit 68bc5ef

Browse files
committed
[WebKit checkers] Add support for ns_returns_autoreleased (llvm#161236)
Recognize ns_returns_autoreleased on a function and treat its return value as a safe pointer origin.
1 parent 943ccaa commit 68bc5ef

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ bool tryToFindPtrOrigin(
9494
if (auto *call = dyn_cast<CallExpr>(E)) {
9595
if (auto *Callee = call->getCalleeDecl()) {
9696
if (Callee->hasAttr<CFReturnsRetainedAttr>() ||
97-
Callee->hasAttr<NSReturnsRetainedAttr>()) {
97+
Callee->hasAttr<NSReturnsRetainedAttr>() ||
98+
Callee->hasAttr<NSReturnsAutoreleasedAttr>()) {
9899
return callback(E, true);
99100
}
100101
}

clang/test/Analysis/Checkers/WebKit/unretained-call-args.mm

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,17 @@ void foo() {
566566

567567
} // namespace ns_retained_return_value
568568

569+
namespace autoreleased {
570+
571+
NSString *provideAutoreleased() __attribute__((ns_returns_autoreleased));
572+
void consume(NSString *);
573+
574+
void foo() {
575+
consume(provideAutoreleased());
576+
}
577+
578+
} // autoreleased
579+
569580
@interface TestObject : NSObject
570581
- (void)doWork:(NSString *)msg, ...;
571582
- (void)doWorkOnSelf;

clang/test/Analysis/Checkers/WebKit/unretained-local-vars.mm

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,18 @@ unsigned foo() {
535535

536536
} // namespace ns_retained_return_value
537537

538+
namespace autoreleased {
539+
540+
NSString *provideAutoreleased() __attribute__((ns_returns_autoreleased));
541+
void consume(NSString *);
542+
543+
void foo() {
544+
auto *string = provideAutoreleased();
545+
consume(string);
546+
}
547+
548+
} // autoreleased
549+
538550
bool doMoreWorkOpaque(OtherObj*);
539551
SomeObj* provide();
540552

0 commit comments

Comments
 (0)