1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -analyze -analyzer-checker=core -verify %s
2176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Zero-sized VLAs.
4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid check_zero_sized_VLA(int x) {
5176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (x)
6176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return;
7176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
8176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int vla[x]; // expected-warning{{Declared variable-length array (VLA) has zero size}}
9176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
11176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid check_uninit_sized_VLA() {
12176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int x;
13176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int vla[x]; // expected-warning{{Declared variable-length array (VLA) uses a garbage value as its size}}
14176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Negative VLAs.
17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic void vla_allocate_signed(int x) {
18176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int vla[x]; // expected-warning{{Declared variable-length array (VLA) has negative size}}
19176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
20176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
21176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic void vla_allocate_unsigned(unsigned int x) {
22176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int vla[x]; // no-warning
23176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
24176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
25176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid check_negative_sized_VLA_1() {
26176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  vla_allocate_signed(-1);
27176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
28176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
29176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid check_negative_sized_VLA_2() {
30176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  vla_allocate_unsigned(-1);
31176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
32176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
33176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid check_negative_sized_VLA_3() {
34176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int x = -1;
35176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int vla[x]; // expected-warning{{Declared variable-length array (VLA) has negative size}}
36176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
37176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
38176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid check_negative_sized_VLA_4() {
39176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  unsigned int x = -1;
40176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int vla[x]; // no-warning
41176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
42176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
43176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid check_negative_sized_VLA_5() {
44176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  signed char x = -1;
45176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int vla[x]; // expected-warning{{Declared variable-length array (VLA) has negative size}}
46176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
47176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
48176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid check_negative_sized_VLA_6() {
49176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  unsigned char x = -1;
50176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int vla[x]; // no-warning
51176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid check_negative_sized_VLA_7() {
54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  signed char x = -1;
55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int vla[x + 2]; // no-warning
56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid check_negative_sized_VLA_8() {
59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  signed char x = 1;
60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int vla[x - 2]; // expected-warning{{Declared variable-length array (VLA) has negative size}}
61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid check_negative_sized_VLA_9() {
64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int x = 1;
65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int vla[x]; // no-warning
66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
67176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic void check_negative_sized_VLA_10_sub(int x)
69176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines{
70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int vla[x]; // expected-warning{{Declared variable-length array (VLA) has negative size}}
71176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
72176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
73176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid check_negative_sized_VLA_10(int x) {
74176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (x < 0)
75176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    check_negative_sized_VLA_10_sub(x);
76176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
77176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstatic void check_negative_sized_VLA_11_sub(int x)
79176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines{
80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int vla[x]; // no-warning
81176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
82176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
83176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid check_negative_sized_VLA_11(int x) {
84176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (x > 0)
85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    check_negative_sized_VLA_11_sub(x);
86176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
87