brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · 16232e9 Raw
141 lines · plain
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -fblocks -verify -Wno-objc-root-class -analyzer-config eagerly-assume=false %s2 3void clang_analyzer_eval(int);4 5@interface Root {6@public7  int uniqueID;8}9 10- (void)refreshID;11@end12 13void testInvalidation(Root *obj) {14  int savedID = obj->uniqueID;15  clang_analyzer_eval(savedID == obj->uniqueID); // expected-warning{{TRUE}}16 17  [obj refreshID];18  clang_analyzer_eval(savedID == obj->uniqueID); // expected-warning{{UNKNOWN}}19}20 21 22@interface Child : Root23@end24 25@implementation Child26- (void)testSuperInvalidation {27  int savedID = self->uniqueID;28  clang_analyzer_eval(savedID == self->uniqueID); // expected-warning{{TRUE}}29 30  [super refreshID];31  clang_analyzer_eval(savedID == self->uniqueID); // expected-warning{{UNKNOWN}}32}33@end34 35 36@interface ManyIvars {37  struct S { int a, b; } s;38  int c;39  int d;40}41@end42 43struct S makeS(void);44 45@implementation ManyIvars46 47- (void)testMultipleIvarInvalidation:(int)useConstraints {48  if (useConstraints) {49    if (s.a != 1) return;50    if (s.b != 2) return;51    if (c != 3) return;52    if (d != 4) return;53    return;54  } else {55    s.a = 1;56    s.b = 2;57    c = 3;58    d = 4;59  }60 61  clang_analyzer_eval(s.a == 1); // expected-warning{{TRUE}}62  clang_analyzer_eval(s.b == 2); // expected-warning{{TRUE}}63  clang_analyzer_eval(c == 3); // expected-warning{{TRUE}}64  clang_analyzer_eval(d == 4); // expected-warning{{TRUE}}65 66  d = 0;67 68  clang_analyzer_eval(s.a == 1); // expected-warning{{TRUE}}69  clang_analyzer_eval(s.b == 2); // expected-warning{{TRUE}}70  clang_analyzer_eval(c == 3); // expected-warning{{TRUE}}71  clang_analyzer_eval(d == 0); // expected-warning{{TRUE}}72 73  d = 4;74  s = makeS();75 76  clang_analyzer_eval(s.a == 1); // expected-warning{{UNKNOWN}}77  clang_analyzer_eval(s.b == 2); // expected-warning{{UNKNOWN}}78  clang_analyzer_eval(c == 3); // expected-warning{{TRUE}}79  clang_analyzer_eval(d == 4); // expected-warning{{TRUE}}80 81  s.a = 1;82 83  clang_analyzer_eval(s.a == 1); // expected-warning{{TRUE}}84  clang_analyzer_eval(s.b == 2); // expected-warning{{UNKNOWN}}85  clang_analyzer_eval(c == 3); // expected-warning{{TRUE}}86  clang_analyzer_eval(d == 4); // expected-warning{{TRUE}}87}88 89+ (void)testMultipleIvarInvalidation:(int)useConstraints90                           forObject:(ManyIvars *)obj {91  if (useConstraints) {92    if (obj->s.a != 1) return;93    if (obj->s.b != 2) return;94    if (obj->c != 3) return;95    if (obj->d != 4) return;96    return;97  } else {98    obj->s.a = 1;99    obj->s.b = 2;100    obj->c = 3;101    obj->d = 4;102  }103 104  clang_analyzer_eval(obj->s.a == 1); // expected-warning{{TRUE}}105  clang_analyzer_eval(obj->s.b == 2); // expected-warning{{TRUE}}106  clang_analyzer_eval(obj->c == 3); // expected-warning{{TRUE}}107  clang_analyzer_eval(obj->d == 4); // expected-warning{{TRUE}}108 109  obj->d = 0;110 111  clang_analyzer_eval(obj->s.a == 1); // expected-warning{{TRUE}}112  clang_analyzer_eval(obj->s.b == 2); // expected-warning{{TRUE}}113  clang_analyzer_eval(obj->c == 3); // expected-warning{{TRUE}}114  clang_analyzer_eval(obj->d == 0); // expected-warning{{TRUE}}115 116  obj->d = 4;117  obj->s = makeS();118 119  clang_analyzer_eval(obj->s.a == 1); // expected-warning{{UNKNOWN}}120  clang_analyzer_eval(obj->s.b == 2); // expected-warning{{UNKNOWN}}121  clang_analyzer_eval(obj->c == 3); // expected-warning{{TRUE}}122  clang_analyzer_eval(obj->d == 4); // expected-warning{{TRUE}}123 124  obj->s.a = 1;125 126  clang_analyzer_eval(obj->s.a == 1); // expected-warning{{TRUE}}127  clang_analyzer_eval(obj->s.b == 2); // expected-warning{{UNKNOWN}}128  clang_analyzer_eval(obj->c == 3); // expected-warning{{TRUE}}129  clang_analyzer_eval(obj->d == 4); // expected-warning{{TRUE}}130}131 132@end133 134 135int testNull(Root *obj) {136  if (obj) return 0;137 138  int *x = &obj->uniqueID;139  return *x; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}}140}141