xref: /aosp_15_r20/external/clang/test/Analysis/vla.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li // Zero-sized VLAs.
check_zero_sized_VLA(int x)4*67e74705SXin Li void check_zero_sized_VLA(int x) {
5*67e74705SXin Li   if (x)
6*67e74705SXin Li     return;
7*67e74705SXin Li 
8*67e74705SXin Li   int vla[x]; // expected-warning{{Declared variable-length array (VLA) has zero size}}
9*67e74705SXin Li }
10*67e74705SXin Li 
check_uninit_sized_VLA()11*67e74705SXin Li void check_uninit_sized_VLA() {
12*67e74705SXin Li   int x;
13*67e74705SXin Li   int vla[x]; // expected-warning{{Declared variable-length array (VLA) uses a garbage value as its size}}
14*67e74705SXin Li }
15*67e74705SXin Li 
16*67e74705SXin Li // Negative VLAs.
vla_allocate_signed(int x)17*67e74705SXin Li static void vla_allocate_signed(int x) {
18*67e74705SXin Li   int vla[x]; // expected-warning{{Declared variable-length array (VLA) has negative size}}
19*67e74705SXin Li }
20*67e74705SXin Li 
vla_allocate_unsigned(unsigned int x)21*67e74705SXin Li static void vla_allocate_unsigned(unsigned int x) {
22*67e74705SXin Li   int vla[x]; // no-warning
23*67e74705SXin Li }
24*67e74705SXin Li 
check_negative_sized_VLA_1()25*67e74705SXin Li void check_negative_sized_VLA_1() {
26*67e74705SXin Li   vla_allocate_signed(-1);
27*67e74705SXin Li }
28*67e74705SXin Li 
check_negative_sized_VLA_2()29*67e74705SXin Li void check_negative_sized_VLA_2() {
30*67e74705SXin Li   vla_allocate_unsigned(-1);
31*67e74705SXin Li }
32*67e74705SXin Li 
check_negative_sized_VLA_3()33*67e74705SXin Li void check_negative_sized_VLA_3() {
34*67e74705SXin Li   int x = -1;
35*67e74705SXin Li   int vla[x]; // expected-warning{{Declared variable-length array (VLA) has negative size}}
36*67e74705SXin Li }
37*67e74705SXin Li 
check_negative_sized_VLA_4()38*67e74705SXin Li void check_negative_sized_VLA_4() {
39*67e74705SXin Li   unsigned int x = -1;
40*67e74705SXin Li   int vla[x]; // no-warning
41*67e74705SXin Li }
42*67e74705SXin Li 
check_negative_sized_VLA_5()43*67e74705SXin Li void check_negative_sized_VLA_5() {
44*67e74705SXin Li   signed char x = -1;
45*67e74705SXin Li   int vla[x]; // expected-warning{{Declared variable-length array (VLA) has negative size}}
46*67e74705SXin Li }
47*67e74705SXin Li 
check_negative_sized_VLA_6()48*67e74705SXin Li void check_negative_sized_VLA_6() {
49*67e74705SXin Li   unsigned char x = -1;
50*67e74705SXin Li   int vla[x]; // no-warning
51*67e74705SXin Li }
52*67e74705SXin Li 
check_negative_sized_VLA_7()53*67e74705SXin Li void check_negative_sized_VLA_7() {
54*67e74705SXin Li   signed char x = -1;
55*67e74705SXin Li   int vla[x + 2]; // no-warning
56*67e74705SXin Li }
57*67e74705SXin Li 
check_negative_sized_VLA_8()58*67e74705SXin Li void check_negative_sized_VLA_8() {
59*67e74705SXin Li   signed char x = 1;
60*67e74705SXin Li   int vla[x - 2]; // expected-warning{{Declared variable-length array (VLA) has negative size}}
61*67e74705SXin Li }
62*67e74705SXin Li 
check_negative_sized_VLA_9()63*67e74705SXin Li void check_negative_sized_VLA_9() {
64*67e74705SXin Li   int x = 1;
65*67e74705SXin Li   int vla[x]; // no-warning
66*67e74705SXin Li }
67*67e74705SXin Li 
check_negative_sized_VLA_10_sub(int x)68*67e74705SXin Li static void check_negative_sized_VLA_10_sub(int x)
69*67e74705SXin Li {
70*67e74705SXin Li   int vla[x]; // expected-warning{{Declared variable-length array (VLA) has negative size}}
71*67e74705SXin Li }
72*67e74705SXin Li 
check_negative_sized_VLA_10(int x)73*67e74705SXin Li void check_negative_sized_VLA_10(int x) {
74*67e74705SXin Li   if (x < 0)
75*67e74705SXin Li     check_negative_sized_VLA_10_sub(x);
76*67e74705SXin Li }
77*67e74705SXin Li 
check_negative_sized_VLA_11_sub(int x)78*67e74705SXin Li static void check_negative_sized_VLA_11_sub(int x)
79*67e74705SXin Li {
80*67e74705SXin Li   int vla[x]; // no-warning
81*67e74705SXin Li }
82*67e74705SXin Li 
check_negative_sized_VLA_11(int x)83*67e74705SXin Li void check_negative_sized_VLA_11(int x) {
84*67e74705SXin Li   if (x > 0)
85*67e74705SXin Li     check_negative_sized_VLA_11_sub(x);
86*67e74705SXin Li }
87