1097ce761SBalazs Benics // -fstrict-flex-arrays=2 means that only undefined or zero element arrays are considered as FAMs.
2097ce761SBalazs Benics
336481758SBalazs Benics // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c90 \
4097ce761SBalazs Benics // RUN: -fstrict-flex-arrays=2
536481758SBalazs Benics // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c99 \
6097ce761SBalazs Benics // RUN: -fstrict-flex-arrays=2
736481758SBalazs Benics // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c11 \
8097ce761SBalazs Benics // RUN: -fstrict-flex-arrays=2
936481758SBalazs Benics // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c17 \
10097ce761SBalazs Benics // RUN: -fstrict-flex-arrays=2
11e5646b92SBalazs Benics
1236481758SBalazs Benics // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++98 -x c++ \
13097ce761SBalazs Benics // RUN: -fstrict-flex-arrays=2
1436481758SBalazs Benics // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++03 -x c++ \
15097ce761SBalazs Benics // RUN: -fstrict-flex-arrays=2
1636481758SBalazs Benics // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++11 -x c++ \
17097ce761SBalazs Benics // RUN: -fstrict-flex-arrays=2
1836481758SBalazs Benics // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++14 -x c++ \
19097ce761SBalazs Benics // RUN: -fstrict-flex-arrays=2
2036481758SBalazs Benics // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++17 -x c++ \
21097ce761SBalazs Benics // RUN: -fstrict-flex-arrays=2
22e5646b92SBalazs Benics
23097ce761SBalazs Benics // By default, -fstrict-flex-arrays=0, which means that even single element arrays are considered as FAMs.
2491c07eb8SBalazs Benics // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c17 \
25097ce761SBalazs Benics // RUN: -DSINGLE_ELEMENT_FAMS
2691c07eb8SBalazs Benics // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++17 -x c++ \
27097ce761SBalazs Benics // RUN: -DSINGLE_ELEMENT_FAMS
2891c07eb8SBalazs Benics
29e5646b92SBalazs Benics typedef __typeof(sizeof(int)) size_t;
30e5646b92SBalazs Benics size_t clang_analyzer_getExtent(void *);
31e5646b92SBalazs Benics void clang_analyzer_dump(size_t);
32e5646b92SBalazs Benics
33e5646b92SBalazs Benics void *alloca(size_t size);
34e5646b92SBalazs Benics void *malloc(size_t size);
35e5646b92SBalazs Benics void free(void *ptr);
36e5646b92SBalazs Benics
test_incomplete_array_fam(void)371ea58437SAaron Ballman void test_incomplete_array_fam(void) {
38e5646b92SBalazs Benics typedef struct FAM {
39e5646b92SBalazs Benics char c;
40e5646b92SBalazs Benics int data[];
41e5646b92SBalazs Benics } FAM;
42e5646b92SBalazs Benics
43e5646b92SBalazs Benics FAM fam;
44e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(&fam));
45e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(fam.data));
46e5646b92SBalazs Benics // expected-warning@-2 {{4 S64b}}
47*12559064Sdingfei // expected-warning@-2 {{0 S64b}}
48e5646b92SBalazs Benics
49e5646b92SBalazs Benics FAM *p = (FAM *)alloca(sizeof(FAM));
50e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(p));
51e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(p->data));
52*12559064Sdingfei // expected-warning@-2 {{4 S64b}}
53*12559064Sdingfei // expected-warning@-2 {{0 S64b}}
54e5646b92SBalazs Benics
55e5646b92SBalazs Benics FAM *q = (FAM *)malloc(sizeof(FAM));
56e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(q));
57e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(q->data));
58*12559064Sdingfei // expected-warning@-2 {{4 S64b}}
59*12559064Sdingfei // expected-warning@-2 {{0 S64b}}
60e5646b92SBalazs Benics free(q);
61*12559064Sdingfei
62*12559064Sdingfei q = (FAM *)malloc(sizeof(FAM) + sizeof(int) * 2);
63*12559064Sdingfei clang_analyzer_dump(clang_analyzer_getExtent(q));
64*12559064Sdingfei clang_analyzer_dump(clang_analyzer_getExtent(q->data));
65*12559064Sdingfei // expected-warning@-2 {{12 S64b}}
66*12559064Sdingfei // expected-warning@-2 {{8 S64b}}
67*12559064Sdingfei free(q);
68*12559064Sdingfei
69*12559064Sdingfei typedef struct __attribute__((packed)) {
70*12559064Sdingfei char c;
71*12559064Sdingfei int data[];
72*12559064Sdingfei } PackedFAM;
73*12559064Sdingfei
74*12559064Sdingfei PackedFAM *t = (PackedFAM *)malloc(sizeof(PackedFAM) + sizeof(int) * 2);
75*12559064Sdingfei clang_analyzer_dump(clang_analyzer_getExtent(t));
76*12559064Sdingfei clang_analyzer_dump(clang_analyzer_getExtent(t->data));
77*12559064Sdingfei // expected-warning@-2 {{9 S64b}}
78*12559064Sdingfei // expected-warning@-2 {{8 S64b}}
79*12559064Sdingfei free(t);
80*12559064Sdingfei }
81*12559064Sdingfei
test_too_small_base(void)82*12559064Sdingfei void test_too_small_base(void) {
83*12559064Sdingfei typedef struct FAM {
84*12559064Sdingfei long c;
85*12559064Sdingfei int data[];
86*12559064Sdingfei } FAM;
87*12559064Sdingfei short s = 0;
88*12559064Sdingfei FAM *p = (FAM *) &s;
89*12559064Sdingfei clang_analyzer_dump(clang_analyzer_getExtent(p));
90*12559064Sdingfei clang_analyzer_dump(clang_analyzer_getExtent(p->data));
91*12559064Sdingfei // expected-warning@-2 {{2 S64b}}
92*12559064Sdingfei // expected-warning@-2 {{-6 S64b}}
93e5646b92SBalazs Benics }
94e5646b92SBalazs Benics
test_zero_length_array_fam(void)951ea58437SAaron Ballman void test_zero_length_array_fam(void) {
96e5646b92SBalazs Benics typedef struct FAM {
97e5646b92SBalazs Benics char c;
98e5646b92SBalazs Benics int data[0];
99e5646b92SBalazs Benics } FAM;
100e5646b92SBalazs Benics
101e5646b92SBalazs Benics FAM fam;
102e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(&fam));
103e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(fam.data));
104e5646b92SBalazs Benics // expected-warning@-2 {{4 S64b}}
105*12559064Sdingfei // expected-warning@-2 {{0 S64b}}
106e5646b92SBalazs Benics
107e5646b92SBalazs Benics FAM *p = (FAM *)alloca(sizeof(FAM));
108e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(p));
109e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(p->data));
110*12559064Sdingfei // expected-warning@-2 {{4 S64b}}
111*12559064Sdingfei // expected-warning@-2 {{0 S64b}}
112e5646b92SBalazs Benics
113e5646b92SBalazs Benics FAM *q = (FAM *)malloc(sizeof(FAM));
114e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(q));
115e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(q->data));
116*12559064Sdingfei // expected-warning@-2 {{4 S64b}}
117*12559064Sdingfei // expected-warning@-2 {{0 S64b}}
118e5646b92SBalazs Benics free(q);
119e5646b92SBalazs Benics }
120e5646b92SBalazs Benics
test_single_element_array_possible_fam(void)1211ea58437SAaron Ballman void test_single_element_array_possible_fam(void) {
122e5646b92SBalazs Benics typedef struct FAM {
123e5646b92SBalazs Benics char c;
124e5646b92SBalazs Benics int data[1];
125e5646b92SBalazs Benics } FAM;
126e5646b92SBalazs Benics
12791c07eb8SBalazs Benics #ifdef SINGLE_ELEMENT_FAMS
12891c07eb8SBalazs Benics FAM likely_fam;
12991c07eb8SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(&likely_fam));
13091c07eb8SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(likely_fam.data));
13191c07eb8SBalazs Benics // expected-warning@-2 {{8 S64b}}
132*12559064Sdingfei // expected-warning@-2 {{4 S64b}}
13391c07eb8SBalazs Benics
13491c07eb8SBalazs Benics FAM *p = (FAM *)alloca(sizeof(FAM));
13591c07eb8SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(p));
13691c07eb8SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(p->data));
137*12559064Sdingfei // expected-warning@-2 {{8 S64b}}
138*12559064Sdingfei // expected-warning@-2 {{4 S64b}}
13991c07eb8SBalazs Benics
14091c07eb8SBalazs Benics FAM *q = (FAM *)malloc(sizeof(FAM));
14191c07eb8SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(q));
14291c07eb8SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(q->data));
143*12559064Sdingfei // expected-warning@-2 {{8 S64b}}
144*12559064Sdingfei // expected-warning@-2 {{4 S64b}}
14591c07eb8SBalazs Benics free(q);
14691c07eb8SBalazs Benics #else
147e5646b92SBalazs Benics FAM likely_fam;
148e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(&likely_fam));
149e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(likely_fam.data));
150e5646b92SBalazs Benics // expected-warning@-2 {{8 S64b}}
151e5646b92SBalazs Benics // expected-warning@-2 {{4 S64b}}
152e5646b92SBalazs Benics
153e5646b92SBalazs Benics FAM *p = (FAM *)alloca(sizeof(FAM));
154e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(p));
155e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(p->data));
156*12559064Sdingfei // expected-warning@-2 {{8 S64b}}
157e5646b92SBalazs Benics // expected-warning@-2 {{4 S64b}}
158e5646b92SBalazs Benics
159e5646b92SBalazs Benics FAM *q = (FAM *)malloc(sizeof(FAM));
160e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(q));
161e5646b92SBalazs Benics clang_analyzer_dump(clang_analyzer_getExtent(q->data));
162*12559064Sdingfei // expected-warning@-2 {{8 S64b}}
163e5646b92SBalazs Benics // expected-warning@-2 {{4 S64b}}
164e5646b92SBalazs Benics free(q);
16591c07eb8SBalazs Benics #endif
166e5646b92SBalazs Benics }
167