brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · d160a94 Raw
89 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config widen-loops=true -analyzer-disable-retry-exhausted -verify %s2 3void clang_analyzer_eval(bool);4void clang_analyzer_dump(int);5 6// 'this' pointer is not an lvalue, we should not invalidate it.7namespace this_pointer_after_loop_widen {8class A {9public:10  A() {11    int count = 10;12    do {13    } while (count--);14  }15};16 17void goo(A a);18void test_temporary_object() {19  goo(A()); // no-crash20}21 22struct B {23  int mem;24  B() : mem(0) {25    for (int i = 0; i < 10; ++i) {26    }27    mem = 0;28  }29};30 31void test_ctor() {32  B b;33  clang_analyzer_eval(b.mem == 0); // expected-warning{{TRUE}}34}35 36struct C {37  int mem;38  C() : mem(0) {}39  void set() {40    for (int i = 0; i < 10; ++i) {41    }42    mem = 10;43  }44};45 46void test_method() {47  C c;48  clang_analyzer_eval(c.mem == 0); // expected-warning{{TRUE}}49  c.set();50  clang_analyzer_eval(c.mem == 10); // expected-warning{{TRUE}}51}52 53struct D {54  int mem;55  D() : mem(0) {}56  void set() {57    for (int i = 0; i < 10; ++i) {58    }59    mem = 10;60  }61};62 63void test_new() {64  D *d = new D;65  clang_analyzer_eval(d->mem == 0); // expected-warning{{TRUE}}66  d->set();67  clang_analyzer_eval(d->mem == 10); // expected-warning{{TRUE}}68}69 70struct E {71  int mem;72  E() : mem(0) {}73  void set() {74    for (int i = 0; i < 10; ++i) {75    }76    setAux();77  }78  void setAux() {79    this->mem = 10;80  }81};82 83void test_chained_method_call() {84  E e;85  e.set();86  clang_analyzer_eval(e.mem == 10); // expected-warning{{TRUE}}87}88} // namespace this_pointer_after_loop_widen89