aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/analyzer/clobbers-2.c
blob: 9a88349d641a1651a94c5adadc828c507c5398ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "analyzer-decls.h"

typedef __SIZE_TYPE__ size_t;
extern void bzero (void *s, size_t n);
extern void *memset(void *s, int c, size_t n);

void test_1 (void)
{
  char arr[16];
  bzero (arr, sizeof (arr));
  __analyzer_eval (arr[0] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[7] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[8] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[9] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[15] == 0); /* { dg-warning "TRUE" } */

  /* Clobber in the middle (with prefix and suffix).  */
  arr[8] = 42;
  __analyzer_eval (arr[0] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[7] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[8] == 0); /* { dg-warning "FALSE" } */
  __analyzer_eval (arr[8] == 42); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[9] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[15] == 0); /* { dg-warning "TRUE" } */
}

void test_2 (void)
{
  char arr[16];
  bzero (arr, sizeof (arr));
  __analyzer_eval (arr[0] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[1] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[15] == 0); /* { dg-warning "TRUE" } */

  /* Clobber at the front (suffix, but no prefix).  */
  arr[0] = 42;
  __analyzer_eval (arr[0] == 0); /* { dg-warning "FALSE" } */
  __analyzer_eval (arr[0] == 42); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[1] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[15] == 0); /* { dg-warning "TRUE" } */
}

void test_3 (void)
{
  char arr[16];
  bzero (arr, sizeof (arr));
  __analyzer_eval (arr[0] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[14] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[15] == 0); /* { dg-warning "TRUE" } */

  /* Clobber at the end (prefix, but no suffix).  */
  arr[15] = 42;
  __analyzer_eval (arr[0] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[14] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[15] == 0); /* { dg-warning "FALSE" } */
  __analyzer_eval (arr[15] == 42); /* { dg-warning "TRUE" } */
}

void test_4 (void)
{
  char arr[16];
  bzero (arr, sizeof (arr));
  __analyzer_eval (arr[0] == 0); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[15] == 0); /* { dg-warning "TRUE" } */

  /* Exact overlap, no prefix or suffix.  */
  memset (arr, 1, 16);
  __analyzer_eval (arr[0] == 0); /* { dg-warning "FALSE" } */
  __analyzer_eval (arr[15] == 0); /* { dg-warning "FALSE" } */
  __analyzer_eval (arr[0] == 1); /* { dg-warning "TRUE" } */
  __analyzer_eval (arr[15] == 1); /* { dg-warning "TRUE" } */
}