Home | History | Annotate | Download | only in inlining
      1 // RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config suppress-inlined-defensive-checks=true -verify %s
      2 
      3 // Perform inline defensive checks.
      4 void idc(int *p) {
      5 	if (p)
      6 		;
      7 }
      8 
      9 int test01(int *p) {
     10   if (p)
     11     ;
     12   return *p; // expected-warning {{Dereference of null pointer}}
     13 }
     14 
     15 int test02(int *p, int *x) {
     16   if (p)
     17     ;
     18   idc(p);
     19 	if (x)
     20 		;
     21   return *p; // expected-warning {{Dereference of null pointer}}
     22 }
     23 
     24 int test03(int *p, int *x) {
     25 	idc(p);
     26 	if (p)
     27 		;
     28 	return *p; // False negative
     29 }
     30 
     31 int deref04(int *p) {
     32   return *p; // expected-warning {{Dereference of null pointer}}
     33 }
     34 
     35 int test04(int *p) {
     36   if (p)
     37     ;
     38   idc(p);
     39   return deref04(p);
     40 }
     41 
     42 int test11(int *q, int *x) {
     43 	int *p = q;
     44 	if (q)
     45 		;
     46 	if (x)
     47 		;
     48 	return *p; // expected-warning{{Dereference of null pointer}}
     49 }
     50 
     51 int test12(int *q) {
     52 	int *p = q;
     53 	idc(q);
     54 	return *p;
     55 }
     56 
     57 int test13(int *q) {
     58 	int *p = q;
     59 	idc(p);
     60 	return *p;
     61 }
     62 
     63 int test21(int *q, int *x) {
     64 	if (q)
     65 		;
     66 	if (x)
     67 		;
     68 	int *p = q;
     69 	return *p; // expected-warning{{Dereference of null pointer}}
     70 }
     71 
     72 int test22(int *q, int *x) {
     73   idc(q);
     74 	if (x)
     75 		;
     76 	int *p = q;
     77 	return *p;
     78 }
     79 
     80 int test23(int *q, int *x) {
     81   idc(q);
     82 	if (x)
     83 		;
     84 	int *p = q;
     85   if (!p)
     86     ;
     87 	return *p; // False negative
     88 }
     89 
     90 void use(char *p) {
     91   if (!p)
     92     return;
     93   p[0] = 'a';
     94 }
     95 
     96 void test24(char *buffer) {
     97   use(buffer);
     98   buffer[1] = 'b';
     99 }
    100 
    101 // Ensure idc works on pointers with constant offset.
    102 void idcchar(const char *s2) {
    103   if(s2)
    104     ;
    105 }
    106 void testConstantOffset(char *value) {
    107   char *cursor = value + 5;
    108   idcchar(cursor);
    109   if (*cursor) {
    110     cursor++;
    111   }
    112 }
    113 
    114 // Ensure idc works for integer zero values (ex: suppressed div by zero).
    115 void idcZero(int assume) {
    116   if (assume)
    117     ;
    118 }
    119 
    120 int idcTriggerZeroValue(int m) {
    121   idcZero(m);
    122   return 5/m; // no-warning
    123 }
    124 
    125 int idcTriggerZeroValueThroughCall(int i) {
    126   return 5/i; // no-warning
    127 }
    128 void idcTrackZeroValueThroughCall(int x) {
    129   idcZero(x);
    130   idcTriggerZeroValueThroughCall(x);
    131 }
    132 
    133 int idcTriggerZeroThroughDoubleAssignemnt(int i) {
    134   return 5/i; // no-warning
    135 }
    136 void idcTrackZeroThroughDoubleAssignemnt(int x) {
    137   idcZero(x);
    138   int y = x;
    139   int z = y;
    140   idcTriggerZeroValueThroughCall(z);
    141 }
    142