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