Summary: Updated the names of the tests with Ok / FN_Bad. Reviewed By: jvillard Differential Revision: D28476289 fbshipit-source-id: f6bdc0318master
parent
903106b298
commit
c6bf155004
@ -0,0 +1,101 @@
|
||||
/*
|
||||
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSObject.h>
|
||||
|
||||
@interface BlockA : NSObject
|
||||
@end
|
||||
|
||||
@implementation BlockA {
|
||||
|
||||
void (^_block_field)(void);
|
||||
}
|
||||
|
||||
- (void)doSomethingThenCallback:(void (^)(void))my_block {
|
||||
// null dereference, segfault if my_block is nil
|
||||
my_block();
|
||||
}
|
||||
|
||||
- (void)FN_assignNilBad {
|
||||
|
||||
void (^my_block)(void) = ^() {
|
||||
};
|
||||
my_block = NULL;
|
||||
my_block(); // Null deref
|
||||
}
|
||||
|
||||
- (void)checkNotNilOk:(void (^)(void))my_block {
|
||||
// ok to call this block!
|
||||
if (my_block != nil) {
|
||||
my_block();
|
||||
}
|
||||
}
|
||||
|
||||
- (void)FN_paramAssignNilBad:(void (^)(void))my_block {
|
||||
|
||||
my_block = NULL;
|
||||
my_block(); // Null deref
|
||||
}
|
||||
|
||||
- (void)FN_paramReassignNilBad:(void (^)(void))my_block_param {
|
||||
|
||||
void (^my_block)(void) = ^() {
|
||||
};
|
||||
my_block = NULL;
|
||||
my_block_param = my_block;
|
||||
my_block_param(); // Null deref
|
||||
}
|
||||
|
||||
- (void)assignEmptyBlockOk:(void (^)(void))my_block_param {
|
||||
|
||||
void (^my_block)(void) = ^() {
|
||||
};
|
||||
my_block_param = my_block;
|
||||
my_block_param(); // No error here
|
||||
}
|
||||
|
||||
- (void)checkNotNilBlockAsArgOk:(BOOL)a
|
||||
block_param:(void (^)(void))block_param {
|
||||
|
||||
void (^my_block)(void) = ^() {
|
||||
if (block_param)
|
||||
block_param(); // No error here
|
||||
};
|
||||
|
||||
if (a) {
|
||||
[self checkNotNilOk:^() {
|
||||
my_block(); // No error here
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)FN_ivarNilBlockBad {
|
||||
_block_field(); // Ivar not nullable
|
||||
}
|
||||
|
||||
- (int)check_nullifyOk {
|
||||
int i = 7;
|
||||
int* x = &i;
|
||||
int (^my_block)(void) = ^() {
|
||||
return *x; // we'll get a false NPE here if we nullify x too early.
|
||||
};
|
||||
return my_block();
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
void calldoSomethingThenCallbackOk() {
|
||||
BlockA* blockA = [BlockA alloc];
|
||||
void (^my_block)(void) = ^() {
|
||||
};
|
||||
[blockA doSomethingThenCallback:my_block];
|
||||
}
|
||||
|
||||
void FN_calldoSomethingThenCallbackWithNilBad() {
|
||||
BlockA* blockA = [BlockA alloc];
|
||||
[blockA doSomethingThenCallback:nil];
|
||||
}
|
Loading…
Reference in new issue