array-struct-region.cpp revision 02df4f0aef142f00d4637cd851e54da2a123ca8e
1// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core,debug.ExprInspection -verify -x c %s 2// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core,debug.ExprInspection -verify -x c++ -analyzer-config c++-inlining=constructors %s 3 4void clang_analyzer_eval(int); 5 6struct S { 7 int field; 8 9#if __cplusplus 10 const struct S *getThis() const { return this; } 11#endif 12}; 13 14struct S getS(); 15 16 17void testAssignment() { 18 struct S s = getS(); 19 20 if (s.field != 42) return; 21 clang_analyzer_eval(s.field == 42); // expected-warning{{TRUE}} 22 23 s.field = 0; 24 clang_analyzer_eval(s.field == 0); // expected-warning{{TRUE}} 25 26#if __cplusplus 27 clang_analyzer_eval(s.getThis() == &s); // expected-warning{{TRUE}} 28#endif 29} 30 31 32void testImmediateUse() { 33 int x = getS().field; 34 35 if (x != 42) return; 36 clang_analyzer_eval(x == 42); // expected-warning{{TRUE}} 37 38#if __cplusplus 39 clang_analyzer_eval((void *)getS().getThis() == (void *)&x); // expected-warning{{FALSE}} 40#endif 41} 42 43int getConstrainedField(struct S s) { 44 if (s.field != 42) return 42; 45 return s.field; 46} 47 48int getAssignedField(struct S s) { 49 s.field = 42; 50 return s.field; 51} 52 53void testArgument() { 54 clang_analyzer_eval(getConstrainedField(getS()) == 42); // expected-warning{{TRUE}} 55 clang_analyzer_eval(getAssignedField(getS()) == 42); // expected-warning{{TRUE}} 56} 57 58 59//-------------------- 60// C++-only tests 61//-------------------- 62 63#if __cplusplus 64void testReferenceAssignment() { 65 const S &s = getS(); 66 67 if (s.field != 42) return; 68 clang_analyzer_eval(s.field == 42); // expected-warning{{TRUE}} 69 70 clang_analyzer_eval(s.getThis() == &s); // expected-warning{{TRUE}} 71} 72 73 74int getConstrainedFieldRef(const S &s) { 75 if (s.field != 42) return 42; 76 return s.field; 77} 78 79bool checkThis(const S &s) { 80 return s.getThis() == &s; 81} 82 83void testReferenceArgument() { 84 clang_analyzer_eval(getConstrainedFieldRef(getS()) == 42); // expected-warning{{TRUE}} 85 clang_analyzer_eval(checkThis(getS())); // expected-warning{{TRUE}} 86} 87#endif 88