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