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 Livoid 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 Livoid 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 Listatic 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 Listatic 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Listatic 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 Livoid 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 Listatic 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 Livoid 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