Skip to content

Commit

Permalink
[analyzer] Fix a bug in RetainCountDiagnostics while printing a note …
Browse files Browse the repository at this point in the history
…on mismatched summary in inlined functions

Previously, we were not printing a note at all if at least one of the parameters was not annotated.

rdar://46888422

Differential Revision: https://reviews.llvm.org/D55972

llvm-svn: 349875
  • Loading branch information
George Karpenkov committed Dec 21, 2018
1 parent 79d8105 commit f508532
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
Expand Up @@ -268,7 +268,7 @@ annotateConsumedSummaryMismatch(const ExplodedNode *N,
const ParmVarDecl *PVD = Parameters[I];

if (!PVD->hasAttr<OSConsumedAttr>())
return nullptr;
continue;

if (SymbolRef SR = Call->getArgSVal(I).getAsLocSymbol()) {
const RefVal *CountBeforeCall = getRefBinding(CN->getState(), SR);
Expand Down Expand Up @@ -311,10 +311,9 @@ CFRefReportVisitor::VisitNode(const ExplodedNode *N,
BugReporterContext &BRC, BugReport &BR) {
const SourceManager &SM = BRC.getSourceManager();
CallEventManager &CEMgr = BRC.getStateManager().getCallEventManager();
if (auto CE = N->getLocationAs<CallExitBegin>()) {
if (auto CE = N->getLocationAs<CallExitBegin>())
if (auto PD = annotateConsumedSummaryMismatch(N, *CE, SM, CEMgr))
return PD;
}

// FIXME: We will eventually need to handle non-statement-based events
// (__attribute__((cleanup))).
Expand Down
16 changes: 16 additions & 0 deletions clang/test/Analysis/osobject-retain-release.cpp
Expand Up @@ -93,6 +93,15 @@ struct OSMetaClassBase {
void escape(void *);
bool coin();

bool os_consume_violation_two_args(OS_CONSUME OSObject *obj, bool extra) {
if (coin()) { // expected-note{{Assuming the condition is false}}
// expected-note@-1{{Taking false branch}}
escape(obj);
return true;
}
return false; // expected-note{{Parameter 'obj' is marked as consuming, but the function does not consume the reference}}
}

bool os_consume_violation(OS_CONSUME OSObject *obj) {
if (coin()) { // expected-note{{Assuming the condition is false}}
// expected-note@-1{{Taking false branch}}
Expand All @@ -113,6 +122,13 @@ void use_os_consume_violation() {
} // expected-note{{Object leaked: object allocated and stored into 'obj' is not referenced later in this execution path and has a retain count of +1}}
// expected-warning@-1{{Potential leak of an object stored into 'obj'}}

void use_os_consume_violation_two_args() {
OSObject *obj = new OSObject; // expected-note{{Operator 'new' returns an OSObject of type OSObject with a +1 retain count}}
os_consume_violation_two_args(obj, coin()); // expected-note{{Calling 'os_consume_violation_two_args'}}
// expected-note@-1{{Returning from 'os_consume_violation_two_args'}}
} // expected-note{{Object leaked: object allocated and stored into 'obj' is not referenced later in this execution path and has a retain count of +1}}
// expected-warning@-1{{Potential leak of an object stored into 'obj'}}

void use_os_consume_ok() {
OSObject *obj = new OSObject;
os_consume_ok(obj);
Expand Down

0 comments on commit f508532

Please sign in to comment.