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