1 // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c90
2 // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c99
3 // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c11
4 // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c17
5
6 // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++98 -x c++
7 // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++03 -x c++
8 // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++11 -x c++
9 // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++14 -x c++
10 // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++17 -x c++
11
12 // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c17 \
13 // RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=true -DSINGLE_ELEMENT_FAMS
14 // RUN: %clang_analyze_cc1 -triple x86_64-linux-gnu -analyzer-checker=core,unix,debug.ExprInspection %s -verify -std=c++17 -x c++ \
15 // RUN: -analyzer-config consider-single-element-arrays-as-flexible-array-members=true -DSINGLE_ELEMENT_FAMS
16
17 typedef __typeof(sizeof(int)) size_t;
18 size_t clang_analyzer_getExtent(void *);
19 void clang_analyzer_dump(size_t);
20
21 void *alloca(size_t size);
22 void *malloc(size_t size);
23 void free(void *ptr);
24
test_incomplete_array_fam(void)25 void test_incomplete_array_fam(void) {
26 typedef struct FAM {
27 char c;
28 int data[];
29 } FAM;
30
31 FAM fam;
32 clang_analyzer_dump(clang_analyzer_getExtent(&fam));
33 clang_analyzer_dump(clang_analyzer_getExtent(fam.data));
34 // expected-warning@-2 {{4 S64b}}
35 // expected-warning@-2 {{Unknown}}
36
37 FAM *p = (FAM *)alloca(sizeof(FAM));
38 clang_analyzer_dump(clang_analyzer_getExtent(p));
39 clang_analyzer_dump(clang_analyzer_getExtent(p->data));
40 // expected-warning@-2 {{4 U64b}}
41 // expected-warning@-2 {{Unknown}}
42
43 FAM *q = (FAM *)malloc(sizeof(FAM));
44 clang_analyzer_dump(clang_analyzer_getExtent(q));
45 clang_analyzer_dump(clang_analyzer_getExtent(q->data));
46 // expected-warning@-2 {{4 U64b}}
47 // expected-warning@-2 {{Unknown}}
48 free(q);
49 }
50
test_zero_length_array_fam(void)51 void test_zero_length_array_fam(void) {
52 typedef struct FAM {
53 char c;
54 int data[0];
55 } FAM;
56
57 FAM fam;
58 clang_analyzer_dump(clang_analyzer_getExtent(&fam));
59 clang_analyzer_dump(clang_analyzer_getExtent(fam.data));
60 // expected-warning@-2 {{4 S64b}}
61 // expected-warning@-2 {{Unknown}}
62
63 FAM *p = (FAM *)alloca(sizeof(FAM));
64 clang_analyzer_dump(clang_analyzer_getExtent(p));
65 clang_analyzer_dump(clang_analyzer_getExtent(p->data));
66 // expected-warning@-2 {{4 U64b}}
67 // expected-warning@-2 {{Unknown}}
68
69 FAM *q = (FAM *)malloc(sizeof(FAM));
70 clang_analyzer_dump(clang_analyzer_getExtent(q));
71 clang_analyzer_dump(clang_analyzer_getExtent(q->data));
72 // expected-warning@-2 {{4 U64b}}
73 // expected-warning@-2 {{Unknown}}
74 free(q);
75 }
76
test_single_element_array_possible_fam(void)77 void test_single_element_array_possible_fam(void) {
78 typedef struct FAM {
79 char c;
80 int data[1];
81 } FAM;
82
83 #ifdef SINGLE_ELEMENT_FAMS
84 FAM likely_fam;
85 clang_analyzer_dump(clang_analyzer_getExtent(&likely_fam));
86 clang_analyzer_dump(clang_analyzer_getExtent(likely_fam.data));
87 // expected-warning@-2 {{8 S64b}}
88 // expected-warning@-2 {{Unknown}}
89
90 FAM *p = (FAM *)alloca(sizeof(FAM));
91 clang_analyzer_dump(clang_analyzer_getExtent(p));
92 clang_analyzer_dump(clang_analyzer_getExtent(p->data));
93 // expected-warning@-2 {{8 U64b}}
94 // expected-warning@-2 {{Unknown}}
95
96 FAM *q = (FAM *)malloc(sizeof(FAM));
97 clang_analyzer_dump(clang_analyzer_getExtent(q));
98 clang_analyzer_dump(clang_analyzer_getExtent(q->data));
99 // expected-warning@-2 {{8 U64b}}
100 // expected-warning@-2 {{Unknown}}
101 free(q);
102 #else
103 FAM likely_fam;
104 clang_analyzer_dump(clang_analyzer_getExtent(&likely_fam));
105 clang_analyzer_dump(clang_analyzer_getExtent(likely_fam.data));
106 // expected-warning@-2 {{8 S64b}}
107 // expected-warning@-2 {{4 S64b}}
108
109 FAM *p = (FAM *)alloca(sizeof(FAM));
110 clang_analyzer_dump(clang_analyzer_getExtent(p));
111 clang_analyzer_dump(clang_analyzer_getExtent(p->data));
112 // expected-warning@-2 {{8 U64b}}
113 // expected-warning@-2 {{4 S64b}}
114
115 FAM *q = (FAM *)malloc(sizeof(FAM));
116 clang_analyzer_dump(clang_analyzer_getExtent(q));
117 clang_analyzer_dump(clang_analyzer_getExtent(q->data));
118 // expected-warning@-2 {{8 U64b}}
119 // expected-warning@-2 {{4 S64b}}
120 free(q);
121 #endif
122 }
123