brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · 4eef372 Raw
130 lines · plain
1// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.NoUnretainedMemberChecker -fobjc-arc -verify %s2 3#include "objc-mock-types.h"4 5namespace members {6 7  struct Foo {8  private:9    SomeObj* a = nullptr;10 11    [[clang::suppress]]12    SomeObj* a_suppressed = nullptr;13 14  protected:15    RetainPtr<SomeObj> b;16 17  public:18    SomeObj* c = nullptr;19    RetainPtr<SomeObj> d;20 21    CFMutableArrayRef e = nullptr;22// expected-warning@-1{{Member variable 'e' in 'members::Foo' is a retainable type 'CFMutableArrayRef'}}23 24    dispatch_queue_t f = nullptr;25  };26  27  union FooUnion {28    SomeObj* a;29    CFMutableArrayRef b;30    // expected-warning@-1{{Member variable 'b' in 'members::FooUnion' is a retainable type 'CFMutableArrayRef'}}31    dispatch_queue_t c;32  };33 34  template<class T, class S, class R>35  struct FooTmpl {36    T* x;37    S y;38// expected-warning@-1{{Member variable 'y' in 'members::FooTmpl<SomeObj, __CFArray *, NSObject<OS_dispatch_queue> *>' is a raw pointer to retainable type}}39    R z;40  };41 42  void forceTmplToInstantiate(FooTmpl<SomeObj, CFMutableArrayRef, dispatch_queue_t>) {}43 44  struct [[clang::suppress]] FooSuppressed {45  private:46    SomeObj* a = nullptr;47  };48 49}50 51namespace ptr_to_ptr_to_retained {52 53  struct List {54    CFMutableArrayRef* elements2;55    // expected-warning@-1{{Member variable 'elements2' in 'ptr_to_ptr_to_retained::List' contains a retainable type 'CFMutableArrayRef'}}56  };57 58  template <typename T, typename S, typename R>59  struct TemplateList {60    T* elements1;61    S* elements2;62    // 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'}}63    R* elements3;64  };65  TemplateList<SomeObj, CFMutableArrayRef, dispatch_queue_t> list;66 67  struct SafeList {68    RetainPtr<SomeObj>* elements1;69    RetainPtr<CFMutableArrayRef>* elements2;70    OSObjectPtr<dispatch_queue_t> elements3;71  };72 73} // namespace ptr_to_ptr_to_retained74 75@interface AnotherObject : NSObject {76  NSString *ns_string;77  CFStringRef cf_string;78  // expected-warning@-1{{Instance variable 'cf_string' in 'AnotherObject' is a retainable type 'CFStringRef'; member variables must be a RetainPtr}}79  dispatch_queue_t queue;80}81@property(nonatomic, strong) NSString *prop_string1;82@property(nonatomic, assign) NSString *prop_string2;83// expected-warning@-1{{Property 'prop_string2' in 'AnotherObject' is a raw pointer to retainable type 'NSString'; member variables must be a RetainPtr}}84@property(nonatomic, unsafe_unretained) NSString *prop_string3;85// expected-warning@-1{{Property 'prop_string3' in 'AnotherObject' is a raw pointer to retainable type 'NSString'; member variables must be a RetainPtr}}86@property(nonatomic, readonly) NSString *prop_string4;87@property(nonatomic, readonly) NSString *prop_safe;88@end89 90@implementation AnotherObject91- (NSString *)prop_safe {92  return nil;93}94@end95 96// No warnings for @interface declaration itself. 97@interface InterfaceOnlyObject : NSObject98@property(nonatomic, strong) NSString *prop_string1;99@property(nonatomic, assign) NSString *prop_string2;100@property(nonatomic, unsafe_unretained) NSString *prop_string3;101@property(nonatomic, readonly) NSString *prop_string4;102@property(nonatomic, readonly) dispatch_queue_t prop_string5;103@end104 105NS_REQUIRES_PROPERTY_DEFINITIONS106@interface NoSynthObject : NSObject {107  NSString *ns_string;108  CFStringRef cf_string;109  // expected-warning@-1{{Instance variable 'cf_string' in 'NoSynthObject' is a retainable type 'CFStringRef'; member variables must be a RetainPtr}}110}111@property(nonatomic, readonly, strong) NSString *prop_string1;112@property(nonatomic, readonly, strong) NSString *prop_string2;113@property(nonatomic, assign) NSString *prop_string3;114// expected-warning@-1{{Property 'prop_string3' in 'NoSynthObject' is a raw pointer to retainable type 'NSString'; member variables must be a RetainPtr}}115@property(nonatomic, unsafe_unretained) NSString *prop_string4;116// expected-warning@-1{{Property 'prop_string4' in 'NoSynthObject' is a raw pointer to retainable type 'NSString'; member variables must be a RetainPtr}}117@property(nonatomic, unsafe_unretained) dispatch_queue_t prop_string5;118// expected-warning@-1{{Property 'prop_string5' in 'NoSynthObject' is a retainable type 'dispatch_queue_t'}}119@end120 121@implementation NoSynthObject122- (NSString *)prop_string1 {123  return nil;124}125@synthesize prop_string2;126@synthesize prop_string3;127@synthesize prop_string4;128@synthesize prop_string5;129@end130