187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Given code 'struct aa { char s1[4]; char * s2;} a; memcpy(a.s1, ...);',
287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// this test checks that the CStringChecker only invalidates the destination buffer array a.s1 (instead of a.s1 and a.s2).
387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// At the moment the whole of the destination array content is invalidated.
487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// If a.s1 region has a symbolic offset, the whole region of 'a' is invalidated.
587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Specific triple set to test structures of size 0.
687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-store=region -verify %s
787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartypedef __typeof(sizeof(int)) size_t;
987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarchar *strdup(const char *s);
1187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid free(void *);
1287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid *memcpy(void *dst, const void *src, size_t n); // expected-note{{passing argument to parameter 'dst' here}}
1387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid *malloc(size_t n);
1487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid clang_analyzer_eval(int);
1687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct aa {
1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    char s1[4];
1987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    char *s2;
2087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test different types of structure initialisation.
2387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f0() {
2487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct aa a0 = {{1, 2, 3, 4}, 0};
2587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a0.s2 = strdup("hello");
2687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
2787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(a0.s1, input, 4);
2887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a0.s1[0] == 'a'); // expected-warning{{UNKNOWN}}
2987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a0.s1[1] == 'b'); // expected-warning{{UNKNOWN}}
3087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a0.s1[2] == 'c'); // expected-warning{{UNKNOWN}}
3187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a0.s1[3] == 'd'); // expected-warning{{UNKNOWN}}
3287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a0.s2 == 0); // expected-warning{{UNKNOWN}}
3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  free(a0.s2); // no warning
3487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
3587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
3687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f1() {
3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct aa a1;
3987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a1.s2 = strdup("hello");
4087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(a1.s1, input, 4);
4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a1.s1[0] == 'a'); // expected-warning{{UNKNOWN}}
4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a1.s1[1] == 'b'); // expected-warning{{UNKNOWN}}
4487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a1.s1[2] == 'c'); // expected-warning{{UNKNOWN}}
4587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a1.s1[3] == 'd'); // expected-warning{{UNKNOWN}}
4687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a1.s2 == 0); // expected-warning{{UNKNOWN}}
4787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  free(a1.s2); // no warning
4887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
4987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
5087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f2() {
5287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct aa a2 = {{1, 2}};
5387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a2.s2 = strdup("hello");
5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(a2.s1, input, 4);
5687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a2.s1[0] == 'a'); // expected-warning{{UNKNOWN}}
5787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a2.s1[1] == 'b'); // expected-warning{{UNKNOWN}}
5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a2.s1[2] == 'c'); // expected-warning{{UNKNOWN}}
5987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a2.s1[3] == 'd'); // expected-warning{{UNKNOWN}}
6087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a2.s2 == 0); // expected-warning{{UNKNOWN}}
6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  free(a2.s2); // no warning
6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
6387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
6487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f3() {
6687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct aa a3 = {{1, 2, 3, 4}, 0};
6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a3.s2 = strdup("hello");
6887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int * dest = (int*)a3.s1;
7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(dest, input, 4);
7187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a3.s1[0] == 'a'); // expected-warning{{UNKNOWN}}
7287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(dest[0] == 'a'); // expected-warning{{UNKNOWN}}
7387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a3.s1[1] == 'b'); // expected-warning{{UNKNOWN}}
7487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(dest[1] == 'b'); // expected-warning{{UNKNOWN}}
7587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a3.s1[2] == 'c'); // expected-warning{{UNKNOWN}}
7687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(dest[2] == 'c'); // expected-warning{{UNKNOWN}}
7787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a3.s1[3] == 'd'); // expected-warning{{UNKNOWN}}
7887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(dest[3] == 'd'); // expected-warning{{UNKNOWN}}
7987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a3.s2 == 0); // expected-warning{{UNKNOWN}}
8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  free(a3.s2); // no warning
8187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
8287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct bb {
8587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct aa a;
8687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s2;
8787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
8887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
8987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f4() {
9087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct bb b0 = {{1, 2, 3, 4}, 0};
9187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  b0.s2 = strdup("hello");
9287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  b0.a.s2 = strdup("hola");
9387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
9487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * dest = (char*)(b0.a.s1);
9587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(dest, input, 4);
9687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(b0.a.s1[0] == 'a'); // expected-warning{{UNKNOWN}}
9787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(dest[0] == 'a'); // expected-warning{{UNKNOWN}}
9887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(b0.a.s1[1] == 'b'); // expected-warning{{UNKNOWN}}
9987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(dest[1] == 'b'); // expected-warning{{UNKNOWN}}
10087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(b0.a.s1[2] == 'c'); // expected-warning{{UNKNOWN}}
10187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(dest[2] == 'c'); // expected-warning{{UNKNOWN}}
10287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(b0.a.s1[3] == 'd'); // expected-warning{{UNKNOWN}}
10387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(dest[3] == 'd'); // expected-warning{{UNKNOWN}}
10487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(b0.s2 == 0); // expected-warning{{UNKNOWN}}
10587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  free(b0.a.s2); // no warning
10687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  free(b0.s2); // no warning
10787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
10887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
10987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
11087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test that memory leaks are caught.
11187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f5() {
11287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct aa a0 = {{1, 2, 3, 4}, 0};
11387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a0.s2 = strdup("hello");
11487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
11587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(a0.s1, input, 4);
11687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0; // expected-warning{{Potential leak of memory pointed to by 'a0.s2'}}
11787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
11887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
11987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f6() {
12087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct aa a1;
12187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a1.s2 = strdup("hello");
12287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
12387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(a1.s1, input, 4);
12487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0; // expected-warning{{Potential leak of memory pointed to by 'a1.s2'}}
12587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
12687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
12787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f7() {
12887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct aa a2 = {{1, 2}};
12987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a2.s2 = strdup("hello");
13087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
13187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(a2.s1, input, 4);
13287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0; // expected-warning{{Potential leak of memory pointed to by 'a2.s2'}}
13387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
13487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
13587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f8() {
13687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct aa a3 = {{1, 2, 3, 4}, 0};
13787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a3.s2 = strdup("hello");
13887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
13987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int * dest = (int*)a3.s1;
14087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(dest, input, 4);
14187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0; // expected-warning{{Potential leak of memory pointed to by 'a3.s2'}}
14287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
14387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
14487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f9() {
14587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct bb b0 = {{1, 2, 3, 4}, 0};
14687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  b0.s2 = strdup("hello");
14787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  b0.a.s2 = strdup("hola");
14887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
14987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * dest = (char*)(b0.a.s1);
15087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(dest, input, 4);
15187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  free(b0.a.s2); // expected-warning{{Potential leak of memory pointed to by 'b0.s2'}}
15287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
15387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
15487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
15587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f10() {
15687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct bb b0 = {{1, 2, 3, 4}, 0};
15787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  b0.s2 = strdup("hello");
15887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  b0.a.s2 = strdup("hola");
15987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
16087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * dest = (char*)(b0.a.s1);
16187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(dest, input, 4);
16287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  free(b0.s2); // expected-warning{{Potential leak of memory pointed to by 'b0.a.s2'}}
16387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
16487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
16587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
16687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test invalidating fields being addresses of array.
16787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct cc {
16887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s1;
16987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s2;
17087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
17187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
17287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f11() {
17387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char x[4] = {1, 2};
17487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  x[0] = 1;
17587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  x[1] = 2;
17687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct cc c0;
17787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  c0.s2 = strdup("hello");
17887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  c0.s1 = &x[0];
17987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
18087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(c0.s1, input, 4);
18187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(x[0] == 1); // expected-warning{{UNKNOWN}}
18287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(x[1] == 2); // expected-warning{{UNKNOWN}}
18387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(c0.s1[0] == 'a'); // expected-warning{{UNKNOWN}}
18487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(c0.s1[1] == 'b'); // expected-warning{{UNKNOWN}}
18587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(c0.s1[2] == 'c'); // expected-warning{{UNKNOWN}}
18687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(c0.s1[3] == 'd'); // expected-warning{{UNKNOWN}}
18787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  free(c0.s2); // no-warning
18887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
18987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
19087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
19187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test inverting field position between s1 and s2.
19287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct dd {
19387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char *s2;
19487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char s1[4];
19587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
19687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
19787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f12() {
19887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct dd d0 = {0, {1, 2, 3, 4}};
19987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  d0.s2 = strdup("hello");
20087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
20187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(d0.s1, input, 4);
20287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d0.s1[0] == 'a'); // expected-warning{{UNKNOWN}}
20387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d0.s1[1] == 'b'); // expected-warning{{UNKNOWN}}
20487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d0.s1[2] == 'c'); // expected-warning{{UNKNOWN}}
20587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d0.s1[3] == 'd'); // expected-warning{{UNKNOWN}}
20687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d0.s2 == 0); // expected-warning{{UNKNOWN}}
20787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  free(d0.s2); // no warning
20887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
20987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
21087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
21187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test arrays of structs.
21287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct ee {
21387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int a;
21487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char b;
21587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
21687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
21787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct EE {
21887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct ee s1[2];
21987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s2;
22087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
22187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
22287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f13() {
22387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct EE E0 = {{{1, 2}, {3, 4}}, 0};
22487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  E0.s2 = strdup("hello");
22587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
22687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(E0.s1, input, 4);
22787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(E0.s1[0].a == 'a'); // expected-warning{{UNKNOWN}}
22887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(E0.s1[0].b == 'b'); // expected-warning{{UNKNOWN}}
22987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(E0.s1[1].a == 'c'); // expected-warning{{UNKNOWN}}
23087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(E0.s1[1].b == 'd'); // expected-warning{{UNKNOWN}}
23187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(E0.s2 == 0); // expected-warning{{UNKNOWN}}
23287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  free(E0.s2); // no warning
23387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
23487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
23587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
23687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test global parameters.
23787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct aa a15 = {{1, 2, 3, 4}, 0};
23887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
23987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f15() {
24087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a15.s2 = strdup("hello");
24187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
24287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(a15.s1, input, 4);
24387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a15.s1[0] == 'a'); // expected-warning{{UNKNOWN}}
24487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a15.s1[1] == 'b'); // expected-warning{{UNKNOWN}}
24587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a15.s1[2] == 'c'); // expected-warning{{UNKNOWN}}
24687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a15.s1[3] == 'd'); // expected-warning{{UNKNOWN}}
24787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a15.s2 == 0); // expected-warning{{UNKNOWN}}
24887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  free(a15.s2); // no warning
24987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
25087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
25187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
25287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test array of 0 sized elements.
25387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct empty {};
25487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct gg {
25587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct empty s1[4];
25687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s2;
25787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
25887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
25987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f16() {
26087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct gg g0 = {{}, 0};
26187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  g0.s2 = strdup("hello");
26287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
26387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(g0.s1, input, 4);
26487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(*(int*)(&g0.s1[0]) == 'a'); // expected-warning{{UNKNOWN}}\
26587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by 'g0.s2'}}
26687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(*(int*)(&g0.s1[1]) == 'b'); // expected-warning{{UNKNOWN}}
26787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(*(int*)(&g0.s1[2]) == 'c'); // expected-warning{{UNKNOWN}}
26887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(*(int*)(&g0.s1[3]) == 'd'); // expected-warning{{UNKNOWN}}
26987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(g0.s2 == 0); // expected-warning{{UNKNOWN}}
27087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  free(g0.s2); // no warning
27187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
27287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
27387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
27487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test array of 0 elements.
27587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct hh {
27687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char s1[0];
27787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s2;
27887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
27987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
28087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f17() {
28187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct hh h0;
28287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  h0.s2 = strdup("hello");
28387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
28487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(h0.s1, input, 4);
28587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(h0.s1[0] == 'a'); // expected-warning{{UNKNOWN}}\
28687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by 'h0.s2'}}
28787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(h0.s2 == 0); // expected-warning{{UNKNOWN}}
28887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  free(h0.s2); // no warning
28987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
29087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
29187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
29287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test writing past the array.
29387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct ii {
29487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char s1[4];
29587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int i;
29687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int j;
29787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s2;
29887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
29987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
30087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f18() {
30187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct ii i18 = {{1, 2, 3, 4}, 5, 6};
30287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  i18.i = 10;
30387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  i18.j = 11;
30487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  i18.s2 = strdup("hello");
30587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[100] = {3};
30687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(i18.s1, input, 100);
30787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(i18.s1[0] == 1); // expected-warning{{UNKNOWN}}\
30887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by 'i18.s2'}}
30987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(i18.s1[1] == 2); // expected-warning{{UNKNOWN}}
31087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(i18.s1[2] == 3); // expected-warning{{UNKNOWN}}
31187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(i18.s1[3] == 4); // expected-warning{{UNKNOWN}}
31287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(i18.i == 10); // expected-warning{{UNKNOWN}}
31387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(i18.j == 11); // expected-warning{{UNKNOWN}}
31487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
31587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
31687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
31787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f181() {
31887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct ii i181 = {{1, 2, 3, 4}, 5, 6};
31987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  i181.i = 10;
32087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  i181.j = 11;
32187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  i181.s2 = strdup("hello");
32287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[100] = {3};
32387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(i181.s1, input, 5); // invalidate the whole region of i181
32487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(i181.s1[0] == 1); // expected-warning{{UNKNOWN}}\
32587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by 'i181.s2'}}
32687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(i181.s1[1] == 2); // expected-warning{{UNKNOWN}}
32787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(i181.s1[2] == 3); // expected-warning{{UNKNOWN}}
32887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(i181.s1[3] == 4); // expected-warning{{UNKNOWN}}
32987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(i181.i == 10); // expected-warning{{UNKNOWN}}
33087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(i181.j == 11); // expected-warning{{UNKNOWN}}
33187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
33287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
33387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
33487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test array with a symbolic offset.
33587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct jj {
33687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char s1[2];
33787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s2;
33887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
33987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
34087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct JJ {
34187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct jj s1[3];
34287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s2;
34387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
34487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
34587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f19(int i) {
34687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct JJ J0 = {{{1, 2, 0}, {3, 4, 0}, {5, 6, 0}}, 0};
34787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  J0.s2 = strdup("hello");
34887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  J0.s1[0].s2 = strdup("hello");
34987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  J0.s1[1].s2 = strdup("hi");
35087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  J0.s1[2].s2 = strdup("world");
35187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[2] = {'a', 'b'};
35287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(J0.s1[i].s1, input, 2);
35387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(J0.s1[0].s1[0] == 1); // expected-warning{{UNKNOWN}}\
35487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by field 's2'}}\
35587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by 'J0.s2'}}
35687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(J0.s1[0].s1[1] == 2); // expected-warning{{UNKNOWN}}
35787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(J0.s1[1].s1[0] == 3); // expected-warning{{UNKNOWN}}
35887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(J0.s1[1].s1[1] == 4); // expected-warning{{UNKNOWN}}
35987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(J0.s1[2].s1[0] == 5); // expected-warning{{UNKNOWN}}
36087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(J0.s1[2].s1[1] == 6); // expected-warning{{UNKNOWN}}
36187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(J0.s1[i].s1[0] == 5); // expected-warning{{UNKNOWN}}
36287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(J0.s1[i].s1[1] == 6); // expected-warning{{UNKNOWN}}
36387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // FIXME: memory leak warning for J0.s2 should be emitted here instead of after memcpy call.
36487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0; // no warning
36587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
36687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
36787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test array with its super region having symbolic offseted regions.
36887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f20(int i) {
36987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct aa * a20 = malloc(sizeof(struct aa) * 2);
37087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a20[0].s1[0] = 1;
37187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a20[0].s1[1] = 2;
37287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a20[0].s1[2] = 3;
37387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a20[0].s1[3] = 4;
37487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a20[0].s2 = strdup("hello");
37587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a20[1].s1[0] = 5;
37687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a20[1].s1[1] = 6;
37787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a20[1].s1[2] = 7;
37887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a20[1].s1[3] = 8;
37987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a20[1].s2 = strdup("world");
38087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a20[i].s2 = strdup("hola");
38187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
38287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(a20[0].s1, input, 4);
38387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[0].s1[0] == 1); // expected-warning{{UNKNOWN}}
38487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[0].s1[1] == 1); // expected-warning{{UNKNOWN}}
38587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[0].s1[2] == 1); // expected-warning{{UNKNOWN}}
38687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[0].s1[3] == 1); // expected-warning{{UNKNOWN}}
38787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[0].s2 == 0); // expected-warning{{UNKNOWN}}
38887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[1].s1[0] == 1); // expected-warning{{UNKNOWN}}
38987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[1].s1[1] == 1); // expected-warning{{UNKNOWN}}
39087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[1].s1[2] == 1); // expected-warning{{UNKNOWN}}
39187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[1].s1[3] == 1); // expected-warning{{UNKNOWN}}
39287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[1].s2 == 0); // expected-warning{{UNKNOWN}}
39387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[i].s1[0] == 1); // expected-warning{{UNKNOWN}}
39487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[i].s1[1] == 1); // expected-warning{{UNKNOWN}}
39587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[i].s1[2] == 1); // expected-warning{{UNKNOWN}}
39687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[i].s1[3] == 1); // expected-warning{{UNKNOWN}}
39787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a20[i].s2 == 0); // expected-warning{{UNKNOWN}}\
39887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by 'a20'}}
39987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
40087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
40187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
40287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
40387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test array's region and super region both having symbolic offsets.
40487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f21(int i) {
40587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct aa * a21 = malloc(sizeof(struct aa) * 2);
40687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[0].s1[0] = 1;
40787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[0].s1[1] = 2;
40887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[0].s1[2] = 3;
40987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[0].s1[3] = 4;
41087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[0].s2 = 0;
41187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[1].s1[0] = 5;
41287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[1].s1[1] = 6;
41387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[1].s1[2] = 7;
41487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[1].s1[3] = 8;
41587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[1].s2 = 0;
41687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[i].s2 = strdup("hello");
41787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[i].s1[0] = 1;
41887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[i].s1[1] = 2;
41987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[i].s1[2] = 3;
42087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a21[i].s1[3] = 4;
42187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
42287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(a21[i].s1, input, 4);
42387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[0].s1[0] == 1); // expected-warning{{UNKNOWN}}
42487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[0].s1[1] == 1); // expected-warning{{UNKNOWN}}
42587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[0].s1[2] == 1); // expected-warning{{UNKNOWN}}
42687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[0].s1[3] == 1); // expected-warning{{UNKNOWN}}
42787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[0].s2 == 0); // expected-warning{{UNKNOWN}}
42887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[1].s1[0] == 1); // expected-warning{{UNKNOWN}}
42987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[1].s1[1] == 1); // expected-warning{{UNKNOWN}}
43087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[1].s1[2] == 1); // expected-warning{{UNKNOWN}}
43187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[1].s1[3] == 1); // expected-warning{{UNKNOWN}}
43287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[1].s2 == 0); // expected-warning{{UNKNOWN}}
43387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[i].s1[0] == 1); // expected-warning{{UNKNOWN}}
43487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[i].s1[1] == 1); // expected-warning{{UNKNOWN}}
43587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[i].s1[2] == 1); // expected-warning{{UNKNOWN}}
43687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[i].s1[3] == 1); // expected-warning{{UNKNOWN}}
43787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a21[i].s2 == 0); // expected-warning{{UNKNOWN}}\
43887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by 'a21'}}
43987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
44087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
44187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
44287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
44387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test regions aliasing other regions.
44487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct ll {
44587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char s1[4];
44687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s2;
44787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
44887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
44987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct mm {
45087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char s3[4];
45187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s4;
45287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
45387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
45487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f24() {
45587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct ll l24 = {{1, 2, 3, 4}, 0};
45687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct mm * m24 = (struct mm *)&l24;
45787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  m24->s4 = strdup("hello");
45887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {1, 2, 3, 4};
45987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(m24->s3, input, 4);
46087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m24->s3[0] == 1); // expected-warning{{UNKNOWN}}
46187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m24->s3[1] == 1); // expected-warning{{UNKNOWN}}
46287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m24->s3[2] == 1); // expected-warning{{UNKNOWN}}
46387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m24->s3[3] == 1); // expected-warning{{UNKNOWN}}
46487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(l24.s1[0] == 1); // expected-warning{{UNKNOWN}}
46587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(l24.s1[1] == 1); // expected-warning{{UNKNOWN}}
46687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(l24.s1[2] == 1); // expected-warning{{UNKNOWN}}
46787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(l24.s1[3] == 1); // expected-warning{{UNKNOWN}}\
46887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by field 's4'}}
46987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
47087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
47187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
47287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test region with potential aliasing and symbolic offsets.
47387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Store assumes no aliasing.
47487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f25(int i, int j, struct ll * l, struct mm * m) {
47587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  m->s4 = strdup("hola"); // m->s4 not tracked
47687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  m->s3[0] = 1;
47787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  m->s3[1] = 2;
47887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  m->s3[2] = 3;
47987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  m->s3[3] = 4;
48087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  m->s3[j] = 5; // invalidates m->s3
48187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  l->s2 = strdup("hello"); // l->s2 not tracked
48287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  l->s1[0] = 6;
48387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  l->s1[1] = 7;
48487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  l->s1[2] = 8;
48587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  l->s1[3] = 9;
48687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  l->s1[i] = 10; // invalidates l->s1
48787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {1, 2, 3, 4};
48887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(m->s3, input, 4); // does not invalidate l->s1[i]
48987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m->s3[0] == 1); // expected-warning{{UNKNOWN}}
49087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m->s3[1] == 1); // expected-warning{{UNKNOWN}}
49187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m->s3[2] == 1); // expected-warning{{UNKNOWN}}
49287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m->s3[3] == 1); // expected-warning{{UNKNOWN}}
49387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m->s3[i] == 1); // expected-warning{{UNKNOWN}}
49487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m->s3[j] == 1); // expected-warning{{UNKNOWN}}
49587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(l->s1[0] == 1); // expected-warning{{UNKNOWN}}
49687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(l->s1[1] == 1); // expected-warning{{UNKNOWN}}
49787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(l->s1[2] == 1); // expected-warning{{UNKNOWN}}
49887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(l->s1[3] == 1); // expected-warning{{UNKNOWN}}
49987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(l->s1[i] == 1); // expected-warning{{FALSE}}
50087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(l->s1[j] == 1); // expected-warning{{UNKNOWN}}
50187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
50287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
50387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
50487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test size with symbolic size argument.
50587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f26(int i) {
50687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct aa a26 = {{1, 2, 3, 4}, 0};
50787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a26.s2 = strdup("hello");
50887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
50987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(a26.s1, input, i); // i assumed in bound
51087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a26.s1[0] == 1); // expected-warning{{UNKNOWN}}
51187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a26.s1[1] == 1); // expected-warning{{UNKNOWN}}
51287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a26.s1[2] == 1); // expected-warning{{UNKNOWN}}
51387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a26.s1[3] == 1); // expected-warning{{UNKNOWN}}\
51487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by 'a26.s2'}}
51587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
51687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
51787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
51887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test sizeof as a size argument.
51987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f261() {
52087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct aa a261 = {{1, 2, 3, 4}, 0};
52187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a261.s2 = strdup("hello");
52287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
52387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(a261.s1, input, sizeof(a261.s1));
52487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a261.s1[0] == 1); // expected-warning{{UNKNOWN}}
52587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a261.s1[1] == 1); // expected-warning{{UNKNOWN}}
52687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a261.s1[2] == 1); // expected-warning{{UNKNOWN}}
52787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a261.s1[3] == 1); // expected-warning{{UNKNOWN}}\
52887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by 'a261.s2'}}
52987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
53087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
53187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
53287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test negative size argument.
53387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f262() {
53487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct aa a262 = {{1, 2, 3, 4}, 0};
53587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  a262.s2 = strdup("hello");
53687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
53787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(a262.s1, input, -1);
53887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a262.s1[0] == 1); // expected-warning{{UNKNOWN}}\
53987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by 'a262.s2'}}
54087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a262.s1[1] == 1); // expected-warning{{UNKNOWN}}
54187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a262.s1[2] == 1); // expected-warning{{UNKNOWN}}
54287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(a262.s1[3] == 1); // expected-warning{{UNKNOWN}}
54387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
54487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
54587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
54687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test size argument being an unknown value.
54787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct xx {
54887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char s1[4];
54987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s2;
55087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
55187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
55287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f263(int n, char * len) {
55387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct xx x263 = {0};
55487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  x263.s2 = strdup("hello");
55587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
55687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(x263.s1, input, *(len + n));
55787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(x263.s1[0] == 0); // expected-warning{{UNKNOWN}}
55887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(x263.s1[1] == 0); // expected-warning{{UNKNOWN}}
55987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(x263.s1[2] == 0); // expected-warning{{UNKNOWN}}
56087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(x263.s1[3] == 0); // expected-warning{{UNKNOWN}}
56187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(x263.s2 == 0); // expected-warning{{UNKNOWN}}
56287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0; // expected-warning{{Potential leak of memory pointed to by 'x263.s2'}}
56387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
56487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
56587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
56687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test casting regions with symbolic offseted sub regions.
56787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f27(int i) {
56887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct mm m27 = {{1, 2, 3, 4}, 0};
56987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  m27.s4 = strdup("hello");
57087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  m27.s3[i] = 5;
57187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
57287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(((struct ll*)(&m27))->s1, input, 4);
57387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m27.s3[0] == 1); // expected-warning{{UNKNOWN}}
57487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m27.s3[1] == 1); // expected-warning{{UNKNOWN}}
57587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m27.s3[2] == 1); // expected-warning{{UNKNOWN}}
57687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m27.s3[3] == 1); // expected-warning{{UNKNOWN}}
57787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m27.s3[i] == 1); // expected-warning{{UNKNOWN}}\
57887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by 'm27.s4'}}
57987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
58087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
58187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
58287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f28(int i, int j, int k, int l) {
58387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct mm m28[2];
58487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  m28[i].s4 = strdup("hello");
58587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  m28[j].s3[k] = 1;
58687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct ll * l28 = (struct ll*)(&m28[1]);
58787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  l28->s1[l] = 2;
58887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
58987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(l28->s1, input, 4);
59087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m28[0].s3[0] == 1); // expected-warning{{UNKNOWN}}
59187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m28[0].s3[1] == 1); // expected-warning{{UNKNOWN}}
59287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m28[0].s3[2] == 1); // expected-warning{{UNKNOWN}}
59387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m28[0].s3[3] == 1); // expected-warning{{UNKNOWN}}
59487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m28[1].s3[0] == 1); // expected-warning{{UNKNOWN}}
59587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m28[1].s3[1] == 1); // expected-warning{{UNKNOWN}}
59687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m28[1].s3[2] == 1); // expected-warning{{UNKNOWN}}
59787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m28[1].s3[3] == 1); // expected-warning{{UNKNOWN}}
59887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m28[i].s3[0] == 1); // expected-warning{{UNKNOWN}}
59987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m28[i].s3[1] == 1); // expected-warning{{UNKNOWN}}
60087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m28[i].s3[2] == 1); // expected-warning{{UNKNOWN}}
60187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m28[i].s3[3] == 1); // expected-warning{{UNKNOWN}}
60287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m28[j].s3[k] == 1); // expected-warning{{UNKNOWN}}
60387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(l28->s1[l] == 2); // expected-warning{{UNKNOWN}}
60487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
60587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
60687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
60787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f29(int i, int j, int k, int l, int m) {
60887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct mm m29[2];
60987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  m29[i].s4 = strdup("hello");
61087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  m29[j].s3[k] = 1;
61187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct ll * l29 = (struct ll*)(&m29[l]);
61287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  l29->s1[m] = 2;
61387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
61487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(l29->s1, input, 4);
61587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m29[0].s3[0] == 1); // expected-warning{{UNKNOWN}}
61687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m29[0].s3[1] == 1); // expected-warning{{UNKNOWN}}
61787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m29[0].s3[2] == 1); // expected-warning{{UNKNOWN}}
61887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m29[0].s3[3] == 1); // expected-warning{{UNKNOWN}}
61987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m29[1].s3[0] == 1); // expected-warning{{UNKNOWN}}
62087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m29[1].s3[1] == 1); // expected-warning{{UNKNOWN}}
62187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m29[1].s3[2] == 1); // expected-warning{{UNKNOWN}}
62287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m29[1].s3[3] == 1); // expected-warning{{UNKNOWN}}
62387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m29[i].s3[0] == 1); // expected-warning{{UNKNOWN}}
62487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m29[i].s3[1] == 1); // expected-warning{{UNKNOWN}}
62587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m29[i].s3[2] == 1); // expected-warning{{UNKNOWN}}
62687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m29[i].s3[3] == 1); // expected-warning{{UNKNOWN}}
62787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(m29[j].s3[k] == 1); // expected-warning{{TRUE}}\
62887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by field 's4'}}
62987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(l29->s1[m] == 2); // expected-warning{{UNKNOWN}}
63087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
63187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
63287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
63387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test unions' fields.
63487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarunion uu {
63587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char x;
63687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char s1[4];
63787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
63887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
63987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f30() {
64087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  union uu u30 = { .s1 = {1, 2, 3, 4}};
64187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {1, 2, 3, 4};
64287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(u30.s1, input, 4);
64387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(u30.s1[0] == 1); // expected-warning{{UNKNOWN}}
64487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(u30.s1[1] == 1); // expected-warning{{UNKNOWN}}
64587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(u30.s1[2] == 1); // expected-warning{{UNKNOWN}}
64687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(u30.s1[3] == 1); // expected-warning{{UNKNOWN}}
64787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(u30.x == 1); // expected-warning{{UNKNOWN}}
64887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
64987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
65087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
65187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct kk {
65287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  union uu u;
65387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s2;
65487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
65587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
65687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f31() {
65787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct kk k31;
65887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  k31.s2 = strdup("hello");
65987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  k31.u.x = 1;
66087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
66187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(k31.u.s1, input, 4);
66287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(k31.u.s1[0] == 1); // expected-warning{{UNKNOWN}}\
66387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by 'k31.s2'}}
66487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(k31.u.s1[1] == 1); // expected-warning{{UNKNOWN}}
66587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(k31.u.s1[2] == 1); // expected-warning{{UNKNOWN}}
66687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(k31.u.s1[3] == 1); // expected-warning{{UNKNOWN}}
66787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(k31.u.x == 1); // expected-warning{{UNKNOWN}}
66887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // FIXME: memory leak warning for k31.s2 should be emitted here.
66987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
67087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
67187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
67287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarunion vv {
67387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int x;
67487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s2;
67587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
67687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
67787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f32() {
67887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  union vv v32;
67987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  v32.s2 = strdup("hello");
68087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
68187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(v32.s2, input, 4);
68287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(v32.s2[0] == 1); // expected-warning{{UNKNOWN}}
68387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(v32.s2[1] == 1); // expected-warning{{UNKNOWN}}
68487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(v32.s2[2] == 1); // expected-warning{{UNKNOWN}}
68587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(v32.s2[3] == 1); // expected-warning{{UNKNOWN}}\
68687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{Potential leak of memory pointed to by 'v32.s2'}}
68787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
68887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
68987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
69087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct nn {
69187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int s1;
69287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int i;
69387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int j;
69487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int k;
69587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s2;
69687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
69787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
69887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test bad types to dest buffer.
69987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f33() {
70087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct nn n33 = {1, 2, 3, 4, 0};
70187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  n33.s2 = strdup("hello");
70287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
70387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(n33.s1, input, 4); // expected-warning{{incompatible integer to pointer conversion passing 'int' to parameter of type 'void *'}}
70487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(n33.i == 2); // expected-warning{{TRUE}}
70587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(n33.j == 3); // expected-warning{{TRUE}}
70687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(n33.k == 4); // expected-warning{{TRUE}}
70787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(((char*)(n33.s1))[0] == 1); // expected-warning{{UNKNOWN}}\
70887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{cast to 'char *' from smaller integer type 'int'}}
70987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(((char*)(n33.s1))[1] == 1); // expected-warning{{UNKNOWN}}\
71087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{cast to 'char *' from smaller integer type 'int'}}
71187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(((char*)(n33.s1))[2] == 1); // expected-warning{{UNKNOWN}}\
71287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{cast to 'char *' from smaller integer type 'int'}}
71387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(((char*)(n33.s1))[3] == 1); // expected-warning{{UNKNOWN}}\
71487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  expected-warning{{cast to 'char *' from smaller integer type 'int'}}
71587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(n33.s2 == 0); //expected-warning{{UNKNOWN}}
71687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0; // expected-warning{{Potential leak of memory pointed to by 'n33.s2'}}
71787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
71887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
71987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test destination buffer being an unknown value.
72087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct ww {
72187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int s1[4];
72287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char s2;
72387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
72487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
72587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f34(struct ww * w34, int n) {
72687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  w34->s2 = 3;
72787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
72887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(w34->s1 + n, input , 4);
72987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(w34->s1[0] == 0); // expected-warning{{UNKNOWN}}
73087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(w34->s1[1] == 0); // expected-warning{{UNKNOWN}}
73187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(w34->s1[2] == 0); // expected-warning{{UNKNOWN}}
73287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(w34->s1[3] == 0); // expected-warning{{UNKNOWN}}
73387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(w34->s1[n] == 0); // expected-warning{{UNKNOWN}}
73487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(w34->s2 == 3); // expected-warning{{TRUE}}
73587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
73687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
73787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
73887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test dest buffer as an element region with a symbolic index and size parameter as a symbolic value.
73987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct yy {
74087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char s1[4];
74187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char * s2;
74287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
74387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
74487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f35(int i, int n) {
74587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  struct yy y35 = {{1, 2, 3, 4}, 0};
74687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  y35.s2 = strdup("hello");
74787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
74887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(&(y35.s1[i]), input, n);
74987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(y35.s1[0] == 0); // expected-warning{{UNKNOWN}}
75087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(y35.s1[1] == 0); // expected-warning{{UNKNOWN}}
75187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(y35.s1[2] == 0); // expected-warning{{UNKNOWN}}
75287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(y35.s1[3] == 0); // expected-warning{{UNKNOWN}}
75387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(y35.s1[i] == 0); // expected-warning{{UNKNOWN}}
75487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(y35.s2 == 0); // expected-warning{{UNKNOWN}}
75587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0; // expected-warning{{Potential leak of memory pointed to by 'y35.s2'}}
75687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
75787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
75887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test regions with negative offsets.
75987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct zz {
76087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char s1[4];
76187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int s2;
76287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
76387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
76487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f36(struct zz * z36) {
76587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
76687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
76787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z36->s1[0] = 0;
76887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z36->s1[1] = 1;
76987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z36->s1[2] = 2;
77087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z36->s1[3] = 3;
77187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z36->s2 = 10;
77287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
77387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z36 = z36 - 1; // Decrement by 8 bytes (struct zz is 8 bytes).
77487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
77587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z36->s1[0] = 4;
77687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z36->s1[1] = 5;
77787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z36->s1[2] = 6;
77887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z36->s1[3] = 7;
77987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z36->s2 = 11;
78087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
78187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(z36->s1, input, 4);
78287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
78387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z36->s1[0] == 1); // expected-warning{{UNKNOWN}}
78487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z36->s1[1] == 1); // expected-warning{{UNKNOWN}}
78587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z36->s1[2] == 1); // expected-warning{{UNKNOWN}}
78687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z36->s1[3] == 1); // expected-warning{{UNKNOWN}}
78787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z36->s2 == 11); // expected-warning{{TRUE}}
78887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
78987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z36 = z36 + 1; // Increment back.
79087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
79187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z36->s1[0] == 0); // expected-warning{{TRUE}}
79287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z36->s1[1] == 1); // expected-warning{{TRUE}}
79387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z36->s1[2] == 2); // expected-warning{{TRUE}}
79487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z36->s1[3] == 3); // expected-warning{{TRUE}}
79587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z36->s2 == 10); // expected-warning{{TRUE}}
79687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
79787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
79887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
79987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
80087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f37(struct zz * z37) {
80187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
80287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
80387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z37->s1[0] = 0;
80487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z37->s1[1] = 1;
80587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z37->s1[2] = 2;
80687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z37->s1[3] = 3;
80787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z37->s2 = 10;
80887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
80987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z37 = (struct zz *)((char*)(z37) - 4); // Decrement by 4 bytes (struct zz is 8 bytes).
81087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
81187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z37->s1[0] = 4;
81287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z37->s1[1] = 5;
81387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z37->s1[2] = 6;
81487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z37->s1[3] = 7;
81587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z37->s2 = 11;
81687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
81787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(z37->s1, input, 4);
81887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
81987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z37->s1[0] == 1); // expected-warning{{UNKNOWN}}
82087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z37->s1[1] == 1); // expected-warning{{UNKNOWN}}
82187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z37->s1[2] == 1); // expected-warning{{UNKNOWN}}
82287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z37->s1[3] == 1); // expected-warning{{UNKNOWN}}
82387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z37->s2 == 11); // expected-warning{{TRUE}}
82487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
82587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z37 = (struct zz *)((char*)(z37) + 4); // Increment back.
82687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
82787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z37->s1[0] == 11); // expected-warning{{TRUE}}
82887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z37->s1[1] == 1); // expected-warning{{UNKNOWN}}
82987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z37->s1[2] == 1); // expected-warning{{UNKNOWN}}
83087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z37->s1[3] == 1); // expected-warning{{UNKNOWN}}
83187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z37->s2 == 10); // expected-warning{{TRUE}}
83287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
83387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
83487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
83587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
83687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f38(struct zz * z38) {
83787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
83887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
83987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z38->s1[0] = 0;
84087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z38->s1[1] = 1;
84187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z38->s1[2] = 2;
84287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z38->s1[3] = 3;
84387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z38->s2 = 10;
84487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
84587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z38 = (struct zz *)((char*)(z38) - 2); // Decrement by 2 bytes (struct zz is 8 bytes).
84687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
84787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z38->s1[0] = 4;
84887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z38->s1[1] = 5;
84987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z38->s1[2] = 6;
85087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z38->s1[3] = 7;
85187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z38->s2 = 11;
85287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
85387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(z38->s1, input, 4);
85487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
85587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z38->s1[0] == 1); // expected-warning{{UNKNOWN}}
85687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z38->s1[1] == 1); // expected-warning{{UNKNOWN}}
85787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z38->s1[2] == 1); // expected-warning{{UNKNOWN}}
85887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z38->s1[3] == 1); // expected-warning{{UNKNOWN}}
85987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z38->s2 == 11); // expected-warning{{TRUE}}
86087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
86187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  z38 = (struct zz *)((char*)(z38) + 2); // Increment back.
86287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
86387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z38->s1[0] == 1); // expected-warning{{UNKNOWN}}
86487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z38->s1[1] == 1); // expected-warning{{UNKNOWN}}
86587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z38->s1[2] == 11); // expected-warning{{TRUE}}
86687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z38->s1[3] == 1); // expected-warning{{UNKNOWN}}
86787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(z38->s2 == 10); // expected-warning{{UNKNOWN}}
86887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
86987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
87087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
87187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
87287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Test negative offsets with a different structure layout.
87387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct z0 {
87487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int s2;
87587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char s1[4];
87687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
87787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
87887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarint f39(struct z0 * d39) {
87987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
88087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char input[] = {'a', 'b', 'c', 'd'};
88187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  d39->s1[0] = 0;
88287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  d39->s1[1] = 1;
88387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  d39->s1[2] = 2;
88487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  d39->s1[3] = 3;
88587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  d39->s2 = 10;
88687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
88787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  d39 = (struct z0 *)((char*)(d39) - 2); // Decrement by 2 bytes (struct z0 is 8 bytes).
88887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
88987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  d39->s1[0] = 4;
89087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  d39->s1[1] = 5;
89187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  d39->s1[2] = 6;
89287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  d39->s1[3] = 7;
89387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  d39->s2 = 11;
89487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
89587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  memcpy(d39->s1, input, 4);
89687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
89787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d39->s1[0] == 1); // expected-warning{{UNKNOWN}}
89887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d39->s1[1] == 1); // expected-warning{{UNKNOWN}}
89987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d39->s1[2] == 1); // expected-warning{{UNKNOWN}}
90087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d39->s1[3] == 1); // expected-warning{{UNKNOWN}}
90187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d39->s2 == 11); // expected-warning{{TRUE}}
90287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
90387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  d39 = (struct z0 *)((char*)(d39) + 2); // Increment back.
90487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
90587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d39->s1[0] == 1); // expected-warning{{UNKNOWN}}
90687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d39->s1[1] == 1); // expected-warning{{UNKNOWN}}
90787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d39->s1[2] == 2); // expected-warning{{TRUE}}
90887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d39->s1[3] == 3); // expected-warning{{TRUE}}
90987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // FIXME: d39->s2 should evaluate to at least UNKNOWN or FALSE,
91087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // 'collectSubRegionBindings(...)' in RegionStore.cpp will need to
91187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // handle a regions' upper boundary overflowing.
91287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  clang_analyzer_eval(d39->s2 == 10); // expected-warning{{TRUE}}
91387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
91487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return 0;
91587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
91687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
917