brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.6 KiB · 2b120b9 Raw
199 lines · plain
1// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.NoUnretainedMemberChecker -verify %s2 3@class SystemObject;4 5#include "objc-mock-types.h"6#include "mock-system-header.h"7 8namespace members {9 10  struct Foo {11  private:12    SomeObj* a = nullptr;13// expected-warning@-1{{Member variable 'a' in 'members::Foo' is a raw pointer to retainable type}}14    dispatch_queue_t a2 = nullptr;15// expected-warning@-1{{Member variable 'a2' in 'members::Foo' is a retainable type 'dispatch_queue_t'}}16 17    [[clang::suppress]]18    SomeObj* a_suppressed = nullptr;19// No warning.20 21  protected:22    RetainPtr<SomeObj> b;23// No warning.24    OSObjectPtr<dispatch_queue_t> b2;25// No warning.26 27  public:28    SomeObj* c = nullptr;29// expected-warning@-1{{Member variable 'c' in 'members::Foo' is a raw pointer to retainable type}}30    RetainPtr<SomeObj> d;31    OSObjectPtr<dispatch_queue_t> d2;32 33    CFMutableArrayRef e = nullptr;34// expected-warning@-1{{Member variable 'e' in 'members::Foo' is a retainable type 'CFMutableArrayRef'}}35 36  };37 38  template<class T, class S, class R>39  struct FooTmpl {40    T* a;41// expected-warning@-1{{Member variable 'a' in 'members::FooTmpl<SomeObj, __CFArray *, NSObject<OS_dispatch_queue> *>' is a raw pointer to retainable type}}42    S b;43// expected-warning@-1{{Member variable 'b' in 'members::FooTmpl<SomeObj, __CFArray *, NSObject<OS_dispatch_queue> *>' is a raw pointer to retainable type}}44    R c;45// expected-warning@-1{{Member variable 'c' in 'members::FooTmpl<SomeObj, __CFArray *, NSObject<OS_dispatch_queue> *>' is a raw pointer to retainable type}}46  };47 48  void forceTmplToInstantiate(FooTmpl<SomeObj, CFMutableArrayRef, dispatch_queue_t>) {}49 50  struct [[clang::suppress]] FooSuppressed {51  private:52    SomeObj* a = nullptr;53// No warning.54  };55 56}57 58namespace unions {59  union Foo {60    SomeObj* a;61    // expected-warning@-1{{Member variable 'a' in 'unions::Foo' is a raw pointer to retainable type 'SomeObj'}}62    RetainPtr<SomeObj> b;63    CFMutableArrayRef c;64    // expected-warning@-1{{Member variable 'c' in 'unions::Foo' is a retainable type 'CFMutableArrayRef'}}65    dispatch_queue_t d;66    // expected-warning@-1{{Member variable 'd' in 'unions::Foo' is a retainable type 'dispatch_queue_t'}}67  };68 69  template<class T>70  union FooTempl {71    T* a;72    // expected-warning@-1{{Member variable 'a' in 'unions::FooTempl<SomeObj>' is a raw pointer to retainable type 'SomeObj'}}73  };74 75  void forceTmplToInstantiate(FooTempl<SomeObj>) {}76}77 78namespace ptr_to_ptr_to_retained {79 80  struct List {81    SomeObj** elements1;82    // expected-warning@-1{{Member variable 'elements1' in 'ptr_to_ptr_to_retained::List' contains a raw pointer to retainable type 'SomeObj'}}83    CFMutableArrayRef* elements2;84    // expected-warning@-1{{Member variable 'elements2' in 'ptr_to_ptr_to_retained::List' contains a retainable type 'CFMutableArrayRef'}}85    dispatch_queue_t* elements3;86    // expected-warning@-1{{Member variable 'elements3' in 'ptr_to_ptr_to_retained::List' contains a retainable type 'dispatch_queue_t'}}87  };88 89  template <typename T, typename S, typename R>90  struct TemplateList {91    T** elements1;92    // expected-warning@-1{{Member variable 'elements1' in 'ptr_to_ptr_to_retained::TemplateList<SomeObj, __CFArray *, NSObject<OS_dispatch_queue> *>' contains a raw pointer to retainable type 'SomeObj'}}93    S* elements2;94    // expected-warning@-1{{Member variable 'elements2' in 'ptr_to_ptr_to_retained::TemplateList<SomeObj, __CFArray *, NSObject<OS_dispatch_queue> *>' contains a raw pointer to retainable type '__CFArray'}}95    R* elements3;96    // expected-warning@-1{{Member variable 'elements3' in 'ptr_to_ptr_to_retained::TemplateList<SomeObj, __CFArray *, NSObject<OS_dispatch_queue> *>' contains a raw pointer to retainable type 'NSObject'}}97  };98  TemplateList<SomeObj, CFMutableArrayRef, dispatch_queue_t> list;99 100  struct SafeList {101    RetainPtr<SomeObj>* elements1;102    RetainPtr<CFMutableArrayRef>* elements2;103  };104 105} // namespace ptr_to_ptr_to_retained106 107@interface AnotherObject : NSObject {108  NSString *ns_string;109  // expected-warning@-1{{Instance variable 'ns_string' in 'AnotherObject' is a raw pointer to retainable type 'NSString'}}110  CFStringRef cf_string;111  // expected-warning@-1{{Instance variable 'cf_string' in 'AnotherObject' is a retainable type 'CFStringRef'}}112  dispatch_queue_t dispatch;113  // expected-warning@-1{{Instance variable 'dispatch' in 'AnotherObject' is a retainable type 'dispatch_queue_t'}}114}115@property(nonatomic, readonly, strong) NSString *prop_string;116@property(nonatomic, readonly) NSString *prop_safe;117@end118 119@implementation AnotherObject120- (NSString *)prop_safe {121  return nil;122}123@end124 125@interface DerivedObject : AnotherObject {126  NSNumber *ns_number;127  // expected-warning@-1{{Instance variable 'ns_number' in 'DerivedObject' is a raw pointer to retainable type 'NSNumber'}}128  CGImageRef cg_image;129  // expected-warning@-1{{Instance variable 'cg_image' in 'DerivedObject' is a retainable type 'CGImageRef'}}130  dispatch_queue_t os_dispatch;131  // expected-warning@-1{{Instance variable 'os_dispatch' in 'DerivedObject' is a retainable type 'dispatch_queue_t'}}132}133@property(nonatomic, strong) NSNumber *prop_number;134@property(nonatomic, readonly) NSString *prop_string;135@end136 137@implementation DerivedObject138- (NSString *)prop_string {139  return nil;140}141@end142 143// No warnings for @interface declaration itself. 144@interface InterfaceOnlyObject : NSObject145@property(nonatomic, strong) NSString *prop_string1;146@property(nonatomic, assign) NSString *prop_string2;147@property(nonatomic, unsafe_unretained) NSString *prop_string3;148@property(nonatomic, readonly) NSString *prop_string4;149@end150 151@interface InterfaceOnlyObject2 : NSObject152@property(nonatomic, strong) NSString *prop_string1;153@property(nonatomic, assign) NSString *prop_string2;154@property(nonatomic, unsafe_unretained) NSString *prop_string3;155// expected-warning@-1{{Property 'prop_string3' in 'DerivedObject2' is a raw pointer to retainable type 'NSString'}}156@property(nonatomic, readonly) NSString *prop_string4;157@end158 159@interface DerivedObject2 : InterfaceOnlyObject2160@property(nonatomic, readonly) NSString *prop_string5;161// expected-warning@-1{{Property 'prop_string5' in 'DerivedObject2' is a raw pointer to retainable type 'NSString'}}162@end163 164@implementation DerivedObject2165@synthesize prop_string3;166@end167 168NS_REQUIRES_PROPERTY_DEFINITIONS169@interface NoSynthObject : NSObject {170  NSString *ns_string;171  // expected-warning@-1{{Instance variable 'ns_string' in 'NoSynthObject' is a raw pointer to retainable type 'NSString'}}172  CFStringRef cf_string;173  // expected-warning@-1{{Instance variable 'cf_string' in 'NoSynthObject' is a retainable type 'CFStringRef'}}174  dispatch_queue_t dispatch;175  // expected-warning@-1{{Instance variable 'dispatch' in 'NoSynthObject' is a retainable type 'dispatch_queue_t'}}176}177@property(nonatomic, readonly, strong) NSString *prop_string1;178@property(nonatomic, readonly, strong) NSString *prop_string2;179@property(nonatomic, assign) NSString *prop_string3;180// expected-warning@-1{{Property 'prop_string3' in 'NoSynthObject' is a raw pointer to retainable type 'NSString'; member variables must be a RetainPtr}}181@property(nonatomic, unsafe_unretained) NSString *prop_string4;182// expected-warning@-1{{Property 'prop_string4' in 'NoSynthObject' is a raw pointer to retainable type 'NSString'; member variables must be a RetainPtr}}183@property(nonatomic, copy) NSString *prop_string5;184@property(nonatomic, readonly, strong) dispatch_queue_t dispatch;185@end186 187@implementation NoSynthObject188- (NSString *)prop_string1 {189  return nil;190}191@synthesize prop_string2;192@synthesize prop_string3;193@synthesize prop_string4;194@synthesize prop_string5;195- (dispatch_queue_t)dispatch {196  return nil;197}198@end199