147 lines · plain
1// RUN: %check_clang_tidy %s bugprone-infinite-loop %t -- -- -fblocks2// RUN: %check_clang_tidy %s bugprone-infinite-loop %t -- -- -fblocks -fobjc-arc3 4typedef __typeof(sizeof(int)) NSUInteger;5 6@interface NSArray7+(instancetype)alloc;8-(instancetype)init;9@property(readonly) NSUInteger count;10-(void)addObject: (id)anObject;11@end12 13@interface I14-(void) instanceMethod;15+(void) classMethod;16+(instancetype)alloc;17-(instancetype)init;18@end19 20void plainCFunction() {21 int i = 0;22 int j = 0;23 while (i < 10) {24 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: this loop is infinite; none of its condition variables (i) are updated in the loop body [bugprone-infinite-loop]25 j++;26 }27}28 29@implementation I30- (void)instanceMethod {31 int i = 0;32 int j = 0;33 while (i < 10) {34 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: this loop is infinite; none of its condition variables (i) are updated in the loop body [bugprone-infinite-loop]35 j++;36 }37}38 39+ (void)classMethod {40 int i = 0;41 int j = 0;42 while (i < 10) {43 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: this loop is infinite; none of its condition variables (i) are updated in the loop body [bugprone-infinite-loop]44 j++;45 }46}47 48+ (void)recursiveMethod {49 static int i = 0;50 51 i++;52 while (i < 10) {53 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: this loop is infinite; none of its condition variables (i) are updated in the loop body [bugprone-infinite-loop]54 [I classMethod];55 }56 57 id x = [[I alloc] init];58 59 while (i < 10) {60 // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: this loop is infinite; none of its condition variables (i) are updated in the loop body [bugprone-infinite-loop]61 [x instanceMethod];62 }63 while (i < 10) {64 // no warning, there is a recursive call that can mutate the static local variable65 [I recursiveMethod];66 }67}68@end69 70void testArrayCount() {71 NSArray *arr = [[NSArray alloc] init];72 NSUInteger max_count = 10;73 while ([arr count] < max_count) {74 // No warning. Array count is updated on every iteration.75 [arr addObject: [[I alloc] init]];76 }77}78 79void testArrayCountWithConstant() {80 NSArray *arr = [[NSArray alloc] init];81 while ([arr count] < 10) {82 // No warning. Array count is updated on every iteration.83 [arr addObject: [[I alloc] init]];84 }85}86 87void testArrayCountProperty() {88 NSArray *arr = [[NSArray alloc] init];89 NSUInteger max_count = 10;90 while (arr.count < max_count) {91 // No warning. Array count is updated on every iteration.92 [arr addObject: [[I alloc] init]];93 }94}95 96void testArrayCountPropertyWithConstant() {97 NSArray *arr = [[NSArray alloc] init];98 while (arr.count < 10) {99 // No warning. Array count is updated on every iteration.100 [arr addObject: [[I alloc] init]];101 }102}103 104@interface MyArray {105 @public NSUInteger _count;106}107+(instancetype)alloc;108-(instancetype)init;109-(void)addObject: (id)anObject;110 111-(void)populate;112@end113 114@implementation MyArray115-(void)populate {116 NSUInteger max_count = 10;117 while (_count < max_count) {118 // No warning. Array count is updated on every iteration.119 [self addObject: [[I alloc] init]];120 }121}122 123-(void)populateWithConstant {124 while (_count < 10) {125 // No warning. Array count is updated on every iteration.126 [self addObject: [[I alloc] init]];127 }128}129@end130 131void testArrayCountIvar() {132 MyArray *arr = [[MyArray alloc] init];133 NSUInteger max_count = 10;134 while (arr->_count < max_count) {135 // No warning. Array count is updated on every iteration.136 [arr addObject: [[I alloc] init]];137 }138}139 140void testArrayCountIvarWithConstant() {141 MyArray *arr = [[MyArray alloc] init];142 while (arr->_count < 10) {143 // No warning. Array count is updated on every iteration.144 [arr addObject: [[I alloc] init]];145 }146}147