array-struct.c revision f936f4568700d799e7d92eecef67b0e2b822ae7e
1// RUN: clang-cc -analyze -checker-simple -analyzer-store=basic -analyzer-constraints=basic -verify %s && 2// RUN: clang-cc -analyze -checker-cfref -analyzer-store=basic -analyzer-constraints=basic -verify %s && 3// RUN: clang-cc -analyze -checker-cfref -analyzer-store=basic -analyzer-constraints=range -verify %s 4 5// RegionStore now has an infinite recursion with this test case. 6// NOWORK: clang-cc -analyze -checker-cfref -analyzer-store=region -analyzer-constraints=basic -verify %s && 7// NOWORK: clang-cc -analyze -checker-cfref -analyzer-store=region -analyzer-constraints=range -verify %s 8 9struct s { 10 int data; 11 int data_array[10]; 12}; 13 14typedef struct { 15 int data; 16} STYPE; 17 18void g1(struct s* p); 19 20// Array to pointer conversion. Array in the struct field. 21void f(void) { 22 int a[10]; 23 int (*p)[10]; 24 p = &a; 25 (*p)[3] = 1; 26 27 struct s d; 28 struct s *q; 29 q = &d; 30 q->data = 3; 31 d.data_array[9] = 17; 32} 33 34// StringLiteral in lvalue context and pointer to array type. 35// p: ElementRegion, q: StringRegion 36void f2() { 37 char *p = "/usr/local"; 38 char (*q)[4]; 39 q = &"abc"; 40} 41 42// Typedef'ed struct definition. 43void f3() { 44 STYPE s; 45} 46 47// Initialize array with InitExprList. 48void f4() { 49 int a[] = { 1, 2, 3}; 50 int b[3] = { 1, 2 }; 51 struct s c[] = {{1,{1}}}; 52} 53 54// Struct variable in lvalue context. 55// Assign UnknownVal to the whole struct. 56void f5() { 57 struct s data; 58 g1(&data); 59} 60 61// AllocaRegion test. 62void f6() { 63 char *p; 64 p = __builtin_alloca(10); 65 p[1] = 'a'; 66} 67 68struct s2; 69 70void g2(struct s2 *p); 71 72// Incomplete struct pointer used as function argument. 73void f7() { 74 struct s2 *p = __builtin_alloca(10); 75 g2(p); 76} 77 78// sizeof() is unsigned while -1 is signed in array index. 79void f8() { 80 int a[10]; 81 a[sizeof(a)/sizeof(int) - 1] = 1; // no-warning 82} 83 84// Initialization of struct array elements. 85void f9() { 86 struct s a[10]; 87} 88 89// Initializing array with string literal. 90void f10() { 91 char a1[4] = "abc"; 92 char a3[6] = "abc"; 93} 94 95// Retrieve the default value of element/field region. 96void f11() { 97 struct s a; 98 g(&a); 99 if (a.data == 0) // no-warning 100 a.data = 1; 101} 102 103// Convert unsigned offset to signed when creating ElementRegion from 104// SymbolicRegion. 105void f12(int *list) { 106 unsigned i = 0; 107 list[i] = 1; 108} 109 110struct s1 { 111 struct s2 { 112 int d; 113 } e; 114}; 115 116// The binding of a.e.d should not be removed. Test recursive subregion map 117// building: a->e, e->d. Only then 'a' could be added to live region roots. 118void f13(double timeout) { 119 struct s1 a; 120 a.e.d = (long) timeout; 121 if (a.e.d == 10) 122 a.e.d = 4; 123} 124 125struct s3 { 126 int a[2]; 127}; 128 129static struct s3 opt; 130 131// Test if the embedded array is retrieved correctly. 132void f14() { 133 struct s3 my_opt = opt; 134} 135