From 190bb38087fa99fcd258df634801a6a3e154753d Mon Sep 17 00:00:00 2001 From: yuyi Date: Thu, 21 Jan 2021 05:17:49 +0800 Subject: [PATCH] checker: check fixed array size (#8224) --- vlib/v/checker/checker.v | 5 ++++- vlib/v/checker/tests/fixed_array_size_err.out | 14 ++++++++++++++ vlib/v/checker/tests/fixed_array_size_err.vv | 8 ++++++++ vlib/v/parser/parse_type.v | 3 +++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 vlib/v/checker/tests/fixed_array_size_err.out create mode 100644 vlib/v/checker/tests/fixed_array_size_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 876d061515..dc4ffaf7d9 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2820,7 +2820,7 @@ pub fn (mut c Checker) array_init(mut array_init ast.ArrayInit) table.Type { array_init.elem_type = elem_type } else if array_init.is_fixed && array_init.exprs.len == 1 && array_init.elem_type != table.void_type { // [50]byte - mut fixed_size := 1 + mut fixed_size := 0 init_expr := array_init.exprs[0] c.expr(init_expr) match init_expr { @@ -2841,6 +2841,9 @@ pub fn (mut c Checker) array_init(mut array_init ast.ArrayInit) table.Type { c.error('expecting `int` for fixed size', array_init.pos) } } + if fixed_size <= 0 { + c.error('fixed size cannot be zero or negative', init_expr.position()) + } idx := c.table.find_or_register_array_fixed(array_init.elem_type, fixed_size) array_type := table.new_type(idx) array_init.typ = array_type diff --git a/vlib/v/checker/tests/fixed_array_size_err.out b/vlib/v/checker/tests/fixed_array_size_err.out new file mode 100644 index 0000000000..9af6b6c10f --- /dev/null +++ b/vlib/v/checker/tests/fixed_array_size_err.out @@ -0,0 +1,14 @@ +vlib/v/checker/tests/fixed_array_size_err.vv:4:8: error: fixed size cannot be zero or negative + 2 | + 3 | fn main() { + 4 | a := [size]int{} + | ~~~~ + 5 | b := [0]byte{} + 6 | println(a) +vlib/v/checker/tests/fixed_array_size_err.vv:5:8: error: fixed size cannot be zero or negative + 3 | fn main() { + 4 | a := [size]int{} + 5 | b := [0]byte{} + | ^ + 6 | println(a) + 7 | println(b) diff --git a/vlib/v/checker/tests/fixed_array_size_err.vv b/vlib/v/checker/tests/fixed_array_size_err.vv new file mode 100644 index 0000000000..eb27c2bf8d --- /dev/null +++ b/vlib/v/checker/tests/fixed_array_size_err.vv @@ -0,0 +1,8 @@ +const size = -1 + +fn main() { + a := [size]int{} + b := [0]byte{} + println(a) + println(b) +} diff --git a/vlib/v/parser/parse_type.v b/vlib/v/parser/parse_type.v index cb3e9bd399..d0f71bdfd5 100644 --- a/vlib/v/parser/parse_type.v +++ b/vlib/v/parser/parse_type.v @@ -40,6 +40,9 @@ pub fn (mut p Parser) parse_array_type() table.Type { // error is handled by parse_type return 0 } + if fixed_size <= 0 { + p.error_with_pos('fixed size cannot be zero or negative', size_expr.position()) + } // sym := p.table.get_type_symbol(elem_type) idx := p.table.find_or_register_array_fixed(elem_type, fixed_size) return table.new_type(idx)