From 1482e994a77b33c525610fdfcf5e0e6889a3e386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Garci=CC=81a=20Hierro?= Date: Sun, 15 Jul 2018 23:35:40 +0100 Subject: [PATCH] When encoding settings, validate that min <= max for all settings This will help catch errors like the one fixed in #3563 early. --- src/utils/settings.rb | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/utils/settings.rb b/src/utils/settings.rb index b84c6f35b7..a3c30483ee 100644 --- a/src/utils/settings.rb +++ b/src/utils/settings.rb @@ -240,8 +240,7 @@ class ValueEncoder return buf.to_carr end - private - def encode_value(buf, val) + def resolve_value(val) v = val || 0 if !v.is_number_kind? v = @constants[val] @@ -249,6 +248,12 @@ class ValueEncoder raise "Could not resolve constant #{val}" end end + return v + end + + private + def encode_value(buf, val) + v = resolve_value(val) pos = @values.find_index(v) if pos < 0 raise "Could not encode value not in array #{v}" @@ -501,14 +506,20 @@ class Generator buf << "\t// #{group["name"]}\n" end - buf << "\t{ #{@name_encoder.format_encoded_name(member["name"])}, " + name = member["name"] + buf << "\t{ #{@name_encoder.format_encoded_name(name)}, " buf << "#{var_type(member["type"])} | #{value_type(group)}" tbl = member["table"] if tbl buf << " | MODE_LOOKUP" buf << ", .config.lookup = { #{table_constant_name(tbl)} }" else - enc = @value_encoder.encode_values(member["min"], member["max"]) + min = @value_encoder.resolve_value(member["min"]) + max = @value_encoder.resolve_value(member["max"]) + if min > max + raise "Error encoding #{name}: min (#{min}) > max (#{max})" + end + enc = @value_encoder.encode_values(min, max) buf << ", .config.minmax.indexes = #{enc}" end buf << ", offsetof(#{group["type"]}, #{member["field"]}) },\n"