brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 203c30c Raw
126 lines · c
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core,debug.ExprInspection %s -verify2 3void clang_analyzer_eval(int);4 5unsigned foo(void);6typedef struct bf { unsigned x:2; } bf;7void bar(void) {8  bf y;9  *(unsigned*)&y = foo();10  y.x = 1;11}12 13struct s {14  int n;15};16 17void f(void) {18  struct s a;19  int *p = &(a.n) + 1; // expected-warning{{Pointer arithmetic on}}20}21 22typedef struct {23  int x,y;24} Point;25 26Point getit(void);27void test(void) {28  Point p;29  (void)(p = getit()).x;30}31 32#define true ((bool)1)33#define false ((bool)0)34typedef _Bool bool;35 36 37void testLazyCompoundVal(void) {38  Point p = {42, 0};39  Point q;40  clang_analyzer_eval((q = p).x == 42); // expected-warning{{TRUE}}41  clang_analyzer_eval(q.x == 42); // expected-warning{{TRUE}}42}43 44 45struct Bits {46  unsigned a : 1;47  unsigned b : 2;48  unsigned c : 1;49 50  bool x;51 52  struct InnerBits {53    bool y;54 55    unsigned d : 16;56    unsigned e : 6;57    unsigned f : 2;58  } inner;59};60 61void testBitfields(void) {62  struct Bits bits;63 64  if (foo() && bits.b) // expected-warning {{garbage}}65    return;66  if (foo() && bits.inner.e) // expected-warning {{garbage}}67    return;68 69  bits.c = 1;70  clang_analyzer_eval(bits.c == 1); // expected-warning {{TRUE}}71 72  if (foo() && bits.b) // expected-warning {{garbage}}73    return;74  if (foo() && bits.x) // expected-warning {{garbage}}75    return;76 77  bits.x = true;78  clang_analyzer_eval(bits.x == true); // expected-warning{{TRUE}}79  bits.b = 2;80  clang_analyzer_eval(bits.x == true); // expected-warning{{TRUE}}81  if (foo() && bits.c) // no-warning82    return;83 84  bits.inner.e = 50;85  if (foo() && bits.inner.e) // no-warning86    return;87  if (foo() && bits.inner.y) // expected-warning {{garbage}}88    return;89  if (foo() && bits.inner.f) // expected-warning {{garbage}}90    return;91 92  extern struct InnerBits getInner(void);93  bits.inner = getInner();94  95  if (foo() && bits.inner.e) // no-warning96    return;97  if (foo() && bits.inner.y) // no-warning98    return;99  if (foo() && bits.inner.f) // no-warning100    return;101 102  bits.inner.f = 1;103  104  if (foo() && bits.inner.e) // no-warning105    return;106  if (foo() && bits.inner.y) // no-warning107    return;108  if (foo() && bits.inner.f) // no-warning109    return;110 111  if (foo() && bits.a) // expected-warning {{garbage}}112    return;113}114 115 116//-----------------------------------------------------------------------------117// Incorrect behavior118//-----------------------------------------------------------------------------119 120void testTruncation(void) {121  struct Bits bits;122  bits.c = 0x11; // expected-warning{{implicit truncation}}123  // FIXME: We don't model truncation of bitfields.124  clang_analyzer_eval(bits.c == 1); // expected-warning {{FALSE}}125}126