5192783bb2
Similarly to other patches of mine, I'm trying to uniformize the checker interface so that dependency checkers don't emit diagnostics. The checker that made me most anxious so far was definitely RetainCount, because it is definitely impacted by backward compatibility concerns, and implements a checker hierarchy that is a lot different to other examples of similar size. Also, I don't have authority, nor expertise regarding ObjC related code, so I welcome any objection/discussion! Differential Revision: https://reviews.llvm.org/D78099
31 lines
974 B
C++
31 lines
974 B
C++
// RUN: %clang_analyze_cc1 -std=c++14 -verify=no-retain-count %s \
|
|
// RUN: -analyzer-checker=core,osx \
|
|
// RUN: -analyzer-disable-checker osx.cocoa.RetainCount
|
|
//
|
|
// RUN: %clang_analyze_cc1 -std=c++14 -verify=no-os-object %s \
|
|
// RUN: -analyzer-checker=core,osx \
|
|
// RUN: -analyzer-disable-checker osx.OSObjectRetainCount
|
|
|
|
#include "os_object_base.h"
|
|
|
|
typedef const void * CFTypeRef;
|
|
extern CFTypeRef CFRetain(CFTypeRef cf);
|
|
extern void CFRelease(CFTypeRef cf);
|
|
|
|
#define CF_RETURNS_RETAINED __attribute__((cf_returns_retained))
|
|
extern CFTypeRef CFCreate() CF_RETURNS_RETAINED;
|
|
|
|
using size_t = decltype(sizeof(int));
|
|
|
|
void cf_overrelease() {
|
|
CFTypeRef cf = CFCreate();
|
|
CFRelease(cf);
|
|
CFRelease(cf); // no-os-object-warning{{Reference-counted object is used after it is released}}
|
|
}
|
|
|
|
void osobject_overrelease() {
|
|
OSObject *o = new OSObject;
|
|
o->release();
|
|
o->release(); // no-retain-count-warning{{Reference-counted object is used after it is released}}
|
|
}
|