diff options
Diffstat (limited to 'test/Analysis/inlining')
| -rw-r--r-- | test/Analysis/inlining/InlineObjCClassMethod.m | 4 | ||||
| -rw-r--r-- | test/Analysis/inlining/false-positive-suppression.m | 30 | ||||
| -rw-r--r-- | test/Analysis/inlining/path-notes.m | 71 |
3 files changed, 95 insertions, 10 deletions
diff --git a/test/Analysis/inlining/InlineObjCClassMethod.m b/test/Analysis/inlining/InlineObjCClassMethod.m index 6efcb894fecd..c9cc90ba27c0 100644 --- a/test/Analysis/inlining/InlineObjCClassMethod.m +++ b/test/Analysis/inlining/InlineObjCClassMethod.m @@ -174,12 +174,12 @@ int foo4() { @implementation MyClassSelf + (int)testClassMethodByKnownVarDecl { int y = [MyParentSelf testSelf]; - return 5/y; // Should warn here. + return 5/y; // expected-warning{{Division by zero}} } @end int foo2() { int y = [MyParentSelf testSelf]; - return 5/y; // Should warn here. + return 5/y; // expected-warning{{Division by zero}} } // TODO: We do not inline 'getNum' in the following case, where the value of diff --git a/test/Analysis/inlining/false-positive-suppression.m b/test/Analysis/inlining/false-positive-suppression.m index 1a5ff662c18e..685e29e23131 100644 --- a/test/Analysis/inlining/false-positive-suppression.m +++ b/test/Analysis/inlining/false-positive-suppression.m @@ -1,8 +1,11 @@ // RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config suppress-null-return-paths=false -verify %s // RUN: %clang_cc1 -analyze -analyzer-checker=core -verify -DSUPPRESSED=1 %s +// RUN: %clang_cc1 -analyze -analyzer-checker=core -fobjc-arc -verify -DSUPPRESSED=1 %s // RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config avoid-suppressing-null-argument-paths=true -DSUPPRESSED=1 -DNULL_ARGS=1 -verify %s -#ifdef SUPPRESSED +#define ARC __has_feature(objc_arc) + +#if defined(SUPPRESSED) && !ARC // expected-no-diagnostics #endif @@ -24,8 +27,9 @@ void testNilReceiverHelperA(int *x) { void testNilReceiverHelperB(int *x) { *x = 1; -#ifndef SUPPRESSED - // expected-warning@-2 {{Dereference of null pointer}} +// FIXME: Suppression for this case isn't working under ARC. It should. +#if !defined(SUPPRESSED) || (defined(SUPPRESSED) && ARC) + // expected-warning@-3 {{Dereference of null pointer}} #endif } @@ -40,13 +44,17 @@ void testNilReceiver(int coin) { // FALSE NEGATIVES (over-suppression) __attribute__((objc_root_class)) -@interface SomeClass +@interface SomeClass { + int ivar; +} -(int *)methodReturningNull; @property(readonly) int *propertyReturningNull; @property(readonly) int *synthesizedProperty; +@property(readonly) SomeClass *propertyReturningNil; + @end @interface SubOfSomeClass : SomeClass @@ -64,6 +72,10 @@ __attribute__((objc_root_class)) return 0; } +-(SomeClass *)propertyReturningNil { + return 0; +} + +(int *)classPropertyReturningNull { return 0; } @@ -103,6 +115,16 @@ void testClassPropertyReturningNull() { #endif } +@implementation SomeClass (ForTestOfPropertyReturningNil) +void testPropertyReturningNil(SomeClass *sc) { + SomeClass *result = sc.propertyReturningNil; + result->ivar = 1; +#ifndef SUPPRESSED + // expected-warning@-2 {{Access to instance variable 'ivar' results in a dereference of a null pointer (loaded from variable 'result')}} +#endif +} +@end + void testSynthesizedPropertyReturningNull(SomeClass *sc) { if (sc.synthesizedProperty) return; diff --git a/test/Analysis/inlining/path-notes.m b/test/Analysis/inlining/path-notes.m index 492b44c9879c..d9b5a5820fe5 100644 --- a/test/Analysis/inlining/path-notes.m +++ b/test/Analysis/inlining/path-notes.m @@ -137,7 +137,7 @@ void testNilReceiverHelper(int *x) { } void testNilReceiver(id *x) { - if (*x) { + if (*x) { // expected-note {{Assuming the condition is false}} // expected-note@-1 {{Taking false branch}} return; } @@ -160,7 +160,7 @@ id testAutoreleaseTakesEffectInDispatch() { dispatch_once(&token, ^{}); id x = [[[[NSObject alloc] init] autorelease] autorelease]; - // expected-note@-1 {{Method returns an Objective-C object with a +1 retain count}} + // expected-note@-1 {{Method returns an instance of NSObject with a +1 retain count}} // expected-note@-2 {{Object autoreleased}} // expected-note@-3 {{Object autoreleased}} @@ -1171,6 +1171,69 @@ void testNullDereferenceInDispatch() { // CHECK-NEXT: <key>end</key> // CHECK-NEXT: <array> // CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>140</integer> +// CHECK-NEXT: <key>col</key><integer>7</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>140</integer> +// CHECK-NEXT: <key>col</key><integer>7</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>kind</key><string>event</string> +// CHECK-NEXT: <key>location</key> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>140</integer> +// CHECK-NEXT: <key>col</key><integer>7</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <key>ranges</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>140</integer> +// CHECK-NEXT: <key>col</key><integer>7</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>140</integer> +// CHECK-NEXT: <key>col</key><integer>8</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: </array> +// CHECK-NEXT: <key>depth</key><integer>0</integer> +// CHECK-NEXT: <key>extended_message</key> +// CHECK-NEXT: <string>Assuming the condition is false</string> +// CHECK-NEXT: <key>message</key> +// CHECK-NEXT: <string>Assuming the condition is false</string> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>kind</key><string>control</string> +// CHECK-NEXT: <key>edges</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>start</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>140</integer> +// CHECK-NEXT: <key>col</key><integer>7</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>140</integer> +// CHECK-NEXT: <key>col</key><integer>7</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: <key>end</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>144</integer> // CHECK-NEXT: <key>col</key><integer>3</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> @@ -1777,9 +1840,9 @@ void testNullDereferenceInDispatch() { // CHECK-NEXT: </array> // CHECK-NEXT: <key>depth</key><integer>0</integer> // CHECK-NEXT: <key>extended_message</key> -// CHECK-NEXT: <string>Method returns an Objective-C object with a +1 retain count</string> +// CHECK-NEXT: <string>Method returns an instance of NSObject with a +1 retain count</string> // CHECK-NEXT: <key>message</key> -// CHECK-NEXT: <string>Method returns an Objective-C object with a +1 retain count</string> +// CHECK-NEXT: <string>Method returns an instance of NSObject with a +1 retain count</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> |
