1  /* { dg-additional-options "-fanalyzer-checker=taint" } */
       2  // TODO: remove need for this option
       3  /* This test can probably be removed when -fanalyzer enables
       4     the taint checker by default.  */
       5  
       6  #include "analyzer-decls.h"
       7  
       8  void
       9  test_1 (char a)
      10  {
      11    char b = -a;
      12  }
      13  
      14  /* Copies of code from data-model-1.c.  */
      15  
      16  void test_20 (int i, int j)
      17  {
      18    __analyzer_eval (i + 1); /* { dg-warning "UNKNOWN" } */
      19    __analyzer_eval (i + j); /* { dg-warning "UNKNOWN" } */
      20  
      21    __analyzer_eval (i - 1); /* { dg-warning "UNKNOWN" } */
      22    __analyzer_eval (i - j); /* { dg-warning "UNKNOWN" } */
      23  
      24    __analyzer_eval (i * 2); /* { dg-warning "UNKNOWN" } */
      25    __analyzer_eval (i * j); /* { dg-warning "UNKNOWN" } */
      26  
      27    __analyzer_eval (i / 2); /* { dg-warning "UNKNOWN" } */
      28    __analyzer_eval (i / j); /* { dg-warning "UNKNOWN" } */
      29  
      30    __analyzer_eval (i % 2); /* { dg-warning "UNKNOWN" } */
      31    __analyzer_eval (i % j); /* { dg-warning "UNKNOWN" } */
      32  
      33    __analyzer_eval (i & 1); /* { dg-warning "UNKNOWN" } */
      34    __analyzer_eval (i & j); /* { dg-warning "UNKNOWN" } */
      35  
      36    __analyzer_eval (i | 1); /* { dg-warning "UNKNOWN" } */
      37    __analyzer_eval (i | j); /* { dg-warning "UNKNOWN" } */
      38  
      39    __analyzer_eval (i ^ 1); /* { dg-warning "UNKNOWN" } */
      40    __analyzer_eval (i ^ j); /* { dg-warning "UNKNOWN" } */
      41  
      42    __analyzer_eval (i >> 1); /* { dg-warning "UNKNOWN" } */
      43    __analyzer_eval (i >> j); /* { dg-warning "UNKNOWN" } */
      44  
      45    __analyzer_eval (i << 1); /* { dg-warning "UNKNOWN" } */
      46    __analyzer_eval (i << j); /* { dg-warning "UNKNOWN" } */
      47  
      48    __analyzer_eval (i && 0); /* { dg-warning "FALSE" } */
      49    __analyzer_eval (i && 1); /* { dg-warning "UNKNOWN" } */
      50    __analyzer_eval (i && j); /* { dg-warning "UNKNOWN" } */
      51  
      52    __analyzer_eval (i || 0); /* { dg-warning "UNKNOWN" } */
      53  
      54    __analyzer_eval (i || 1); /* { dg-warning "TRUE" } */
      55    __analyzer_eval (i || j); /* { dg-warning "UNKNOWN" } */
      56  
      57    __analyzer_eval (~i); /* { dg-warning "UNKNOWN" } */
      58    __analyzer_eval (-i); /* { dg-warning "UNKNOWN" } */
      59    __analyzer_eval (+i); /* { dg-warning "UNKNOWN" } */
      60  
      61    /* Anything added above should be added to the next function also.  */
      62  }
      63  
      64  void test_21 (void)
      65  {
      66    int i, j, zero;
      67    int *pi = &i;
      68    int *pj = &j;
      69    int *pzero = &zero;
      70    *pi = 5;
      71    *pj = 3;
      72    *pzero = 0;
      73  
      74    __analyzer_eval (i + j == 8); /* { dg-warning "TRUE" } */
      75    __analyzer_eval (i - j == 2); /* { dg-warning "TRUE" } */
      76    __analyzer_eval (i * j == 15); /* { dg-warning "TRUE" } */
      77    __analyzer_eval (i / j == 1); /* { dg-warning "TRUE" } */
      78    __analyzer_eval (i % j == 2); /* { dg-warning "TRUE" } */
      79  
      80    /* Division by zero.  */
      81    // TODO: should we warn for this?
      82    __analyzer_eval (i / zero); /* { dg-warning "UNKNOWN" } */
      83    __analyzer_eval (i % zero); /* { dg-warning "UNKNOWN" } */
      84  
      85    __analyzer_eval ((i & 1) == (5 & 1)); /* { dg-warning "TRUE" } */
      86    __analyzer_eval ((i & j) == (5 & 3)); /* { dg-warning "TRUE" } */
      87    __analyzer_eval ((i | 1) == (5 | 1)); /* { dg-warning "TRUE" } */
      88    __analyzer_eval ((i | j) == (5 | 3)); /* { dg-warning "TRUE" } */
      89    __analyzer_eval ((i ^ 1) == (5 ^ 1)); /* { dg-warning "TRUE" } */
      90    __analyzer_eval ((i ^ j) == (5 ^ 3)); /* { dg-warning "TRUE" } */
      91    __analyzer_eval ((i >> 1) == (5 >> 1)); /* { dg-warning "TRUE" } */
      92    __analyzer_eval ((i >> j) == (5 >> 3)); /* { dg-warning "TRUE" } */
      93    __analyzer_eval ((i << 1) == (5 << 1)); /* { dg-warning "TRUE" } */
      94    __analyzer_eval ((i << j) == (5 << 3)); /* { dg-warning "TRUE" } */
      95    __analyzer_eval (i && 0); /* { dg-warning "FALSE" } */
      96    __analyzer_eval (i && 1); /* { dg-warning "TRUE" } */
      97    __analyzer_eval (i && j); /* { dg-warning "TRUE" } */
      98  
      99    __analyzer_eval (i || 0); /* { dg-warning "TRUE" } */
     100    __analyzer_eval (i || 1); /* { dg-warning "TRUE" } */
     101    __analyzer_eval (i || j); /* { dg-warning "TRUE" } */
     102  
     103    __analyzer_eval (~i == ~5); /* { dg-warning "TRUE" } */
     104    __analyzer_eval (-i == -5); /* { dg-warning "TRUE" } */
     105    __analyzer_eval (+i == +5); /* { dg-warning "TRUE" } */
     106  }