diff options
author | Anna Zaks <ganna@apple.com> | 2012-08-10 18:55:58 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2012-08-10 18:55:58 +0000 |
commit | 75f49a9c07b671c7d16f8651b977eadfb260f761 (patch) | |
tree | e24eae319b120770df514c0c72101d52c474f8fa /clang/test | |
parent | 920af014c1687ba7250dc9a97e08327872d70b9b (diff) | |
download | bcm5719-llvm-75f49a9c07b671c7d16f8651b977eadfb260f761.tar.gz bcm5719-llvm-75f49a9c07b671c7d16f8651b977eadfb260f761.zip |
[analyzer] Track if a region can be a subclass in the dynamic type info.
When object is allocated with alloc or init, we assume it cannot be a
subclass (currently used only for bifurcation purposes).
llvm-svn: 161682
Diffstat (limited to 'clang/test')
5 files changed, 27 insertions, 40 deletions
diff --git a/clang/test/Analysis/inlining/InlineObjCClassMethod.m b/clang/test/Analysis/inlining/InlineObjCClassMethod.m index a5a1369bfe5..7e8b51fe0be 100644 --- a/clang/test/Analysis/inlining/InlineObjCClassMethod.m +++ b/clang/test/Analysis/inlining/InlineObjCClassMethod.m @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-ipa=dynamic -verify %s +// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-ipa=dynamic-bifurcate -verify %s // Test inlining of ObjC class methods. diff --git a/clang/test/Analysis/inlining/InlineObjCInstanceMethod.h b/clang/test/Analysis/inlining/InlineObjCInstanceMethod.h index bae80c60ec6..715b89eff8c 100644 --- a/clang/test/Analysis/inlining/InlineObjCInstanceMethod.h +++ b/clang/test/Analysis/inlining/InlineObjCInstanceMethod.h @@ -11,6 +11,7 @@ typedef struct objc_object { @protocol NSObject - (BOOL)isEqual:(id)object; @end @interface NSObject <NSObject> {} +(id)alloc; ++(id)new; -(id)init; -(id)autorelease; -(id)copy; @@ -24,3 +25,12 @@ typedef struct objc_object { @interface PublicSubClass : PublicClass @end + +@interface PublicParent : NSObject +- (int)getZeroOverridden; +@end + +@interface PublicSubClass2 : PublicParent +- (int) getZeroOverridden; +@end + diff --git a/clang/test/Analysis/inlining/InlineObjCInstanceMethod.m b/clang/test/Analysis/inlining/InlineObjCInstanceMethod.m index d7b184e0020..31b6d5baa6f 100644 --- a/clang/test/Analysis/inlining/InlineObjCInstanceMethod.m +++ b/clang/test/Analysis/inlining/InlineObjCInstanceMethod.m @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-ipa=dynamic -verify %s +// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-ipa=dynamic-bifurcate -verify %s #include "InlineObjCInstanceMethod.h" diff --git a/clang/test/Analysis/inlining/ObjCDynTypePopagation.m b/clang/test/Analysis/inlining/ObjCDynTypePopagation.m index 960449758bf..4faaa2cb303 100644 --- a/clang/test/Analysis/inlining/ObjCDynTypePopagation.m +++ b/clang/test/Analysis/inlining/ObjCDynTypePopagation.m @@ -1,28 +1,12 @@ -// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-ipa=dynamic -verify %s - -typedef signed char BOOL; -typedef struct objc_class *Class; -typedef struct objc_object { - Class isa; -} *id; - -void clang_analyzer_eval(BOOL); - -@protocol NSObject - (BOOL)isEqual:(id)object; @end -@interface NSObject <NSObject> {} -+(id)alloc; --(id)init; -+(id)new; --(id)autorelease; --(id)copy; -- (Class)class; --(id)retain; -@end +// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-ipa=dynamic-bifurcate -verify %s -@interface MyParent : NSObject -- (int)getZeroOverridden; -@end -@implementation MyParent +#include "InlineObjCInstanceMethod.h" + +void clang_analyzer_eval(int); + +PublicSubClass2 *getObj(); + +@implementation PublicParent - (int) getZeroOverridden { return 1; } @@ -31,19 +15,12 @@ void clang_analyzer_eval(BOOL); } @end -@interface MyClass : MyParent -- (int) getZeroOverridden; -@end - -MyClass *getObj(); - -@implementation MyClass +@implementation PublicSubClass2 - (int) getZeroOverridden { return 0; } /* Test that we get the right type from call to alloc. */ - + (void) testAllocSelf { id a = [self alloc]; clang_analyzer_eval([a getZeroOverridden] == 0); // expected-warning{{TRUE}} @@ -51,7 +28,7 @@ MyClass *getObj(); + (void) testAllocClass { - id a = [MyClass alloc]; + id a = [PublicSubClass2 alloc]; clang_analyzer_eval([a getZeroOverridden] == 0); // expected-warning{{TRUE}} } @@ -79,19 +56,19 @@ MyClass *getObj(); // Casting to parent should not pessimize the dynamic type. + (void) testCastToParent { id a = [[self alloc] init]; - MyParent *p = a; + PublicParent *p = a; clang_analyzer_eval([p getZeroOverridden] == 0); // expected-warning{{TRUE}} } // The type of parameter gets used. -+ (void)testTypeFromParam:(MyParent*) p { ++ (void)testTypeFromParam:(PublicParent*) p { clang_analyzer_eval([p getZero] == 0); // expected-warning{{TRUE}} } // Test implicit cast. // Note, in this case, p could also be a subclass of MyParent. + (void) testCastFromId:(id) a { - MyParent *p = a; + PublicParent *p = a; clang_analyzer_eval([p getZero] == 0); // expected-warning{{TRUE}} } @end @@ -99,7 +76,7 @@ MyClass *getObj(); // TODO: Would be nice to handle the case of dynamically obtained class info // as well. We need a MemRegion for class types for this. int testDynamicClass(BOOL coin) { - Class AllocClass = (coin ? [NSObject class] : [MyClass class]); + Class AllocClass = (coin ? [NSObject class] : [PublicSubClass2 class]); id x = [[AllocClass alloc] init]; if (coin) return [x getZero]; diff --git a/clang/test/Analysis/inlining/ObjCImproperDynamictallyDetectableCast.m b/clang/test/Analysis/inlining/ObjCImproperDynamictallyDetectableCast.m index d337ee4b164..739e10f2a5f 100644 --- a/clang/test/Analysis/inlining/ObjCImproperDynamictallyDetectableCast.m +++ b/clang/test/Analysis/inlining/ObjCImproperDynamictallyDetectableCast.m @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-ipa=dynamic -verify %s +// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-ipa=dynamic-bifurcate -verify %s typedef signed char BOOL; @protocol NSObject - (BOOL)isEqual:(id)object; @end |