llvm/clang/test/Analysis/test-separate-retaincount.cpp
Kirstóf Umann 5192783bb2 [analyzer][RetainCount] Tie diagnostics to osx.cocoa.RetainCount rather then RetainCountBase, for the most part
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
2020-05-27 00:01:47 +02:00

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}}
}