From 3e5d71431a8a79c433c1ecc9e62a4d445a9b3d6b Mon Sep 17 00:00:00 2001 From: schaeff Date: Mon, 3 May 2021 19:20:18 +0200 Subject: [PATCH] remove bounds checker --- Cargo.lock | 12 +- .../src/static_analysis/bounds_checker.rs | 134 ------------------ zokrates_core/src/static_analysis/mod.rs | 4 - 3 files changed, 6 insertions(+), 144 deletions(-) delete mode 100644 zokrates_core/src/static_analysis/bounds_checker.rs diff --git a/Cargo.lock b/Cargo.lock index 44f43a5a..f6807280 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2269,7 +2269,7 @@ dependencies = [ [[package]] name = "zokrates_cli" -version = "0.7.0" +version = "0.7.1" dependencies = [ "assert_cli", "bincode", @@ -2294,7 +2294,7 @@ version = "0.1.0" [[package]] name = "zokrates_core" -version = "0.6.0" +version = "0.6.1" dependencies = [ "ark-bls12-377", "ark-bn254", @@ -2335,7 +2335,7 @@ dependencies = [ [[package]] name = "zokrates_core_test" -version = "0.2.0" +version = "0.2.1" dependencies = [ "zokrates_test", "zokrates_test_derive", @@ -2381,7 +2381,7 @@ dependencies = [ [[package]] name = "zokrates_parser" -version = "0.2.0" +version = "0.2.1" dependencies = [ "glob 0.2.11", "pest", @@ -2390,7 +2390,7 @@ dependencies = [ [[package]] name = "zokrates_pest_ast" -version = "0.2.0" +version = "0.2.1" dependencies = [ "from-pest", "glob 0.2.11", @@ -2402,7 +2402,7 @@ dependencies = [ [[package]] name = "zokrates_stdlib" -version = "0.2.0" +version = "0.2.1" dependencies = [ "fs_extra", "zokrates_test", diff --git a/zokrates_core/src/static_analysis/bounds_checker.rs b/zokrates_core/src/static_analysis/bounds_checker.rs deleted file mode 100644 index de43d5f0..00000000 --- a/zokrates_core/src/static_analysis/bounds_checker.rs +++ /dev/null @@ -1,134 +0,0 @@ -use crate::typed_absy::result_folder::*; -use crate::typed_absy::*; -use zokrates_field::Field; - -pub struct BoundsChecker; - -pub type Error = String; - -impl BoundsChecker { - pub fn check(p: TypedProgram) -> Result, Error> { - BoundsChecker.fold_program(p) - } - - pub fn check_select<'ast, T: Field, U: Select<'ast, T>>( - &mut self, - array: ArrayExpression<'ast, T>, - index: UExpression<'ast, T>, - ) -> Result { - let array = self.fold_array_expression(array)?; - let index = self.fold_uint_expression(index)?; - - match (array.get_array_type().size.as_inner(), index.as_inner()) { - (UExpressionInner::Value(size), UExpressionInner::Value(index)) => { - if index >= size { - return Err(format!( - "Out of bounds access: {}[{}] but {} is of size {}", - array, index, array, size - )); - } - } - _ => unreachable!(), - }; - - Ok(U::select(array, index)) - } -} - -impl<'ast, T: Field> ResultFolder<'ast, T> for BoundsChecker { - type Error = Error; - - fn fold_array_expression_inner( - &mut self, - ty: &ArrayType<'ast, T>, - e: ArrayExpressionInner<'ast, T>, - ) -> Result, Self::Error> { - match e { - ArrayExpressionInner::Select(box array, box index) => self - .check_select::<_, ArrayExpression<_>>(array, index) - .map(|a| a.into_inner()), - ArrayExpressionInner::Slice(box array, box from, box to) => { - let array = self.fold_array_expression(array)?; - let from = self.fold_uint_expression(from)?; - let to = self.fold_uint_expression(to)?; - - match ( - array.get_array_type().size.as_inner(), - from.as_inner(), - to.as_inner(), - ) { - ( - UExpressionInner::Value(size), - UExpressionInner::Value(from), - UExpressionInner::Value(to), - ) => { - if from > to { - return Err(format!( - "Slice is created from an invalid range {}..{}", - from, to - )); - } - - if from > size { - return Err(format!("Lower bound {} of slice {}[{}..{}] is out of bounds for array of size {}", from, array, from, to, size)); - } - - if to > size { - return Err(format!("Upper bound {} of slice {}[{}..{}] is out of bounds for array of size {}", to, array, from, to, size)); - } - } - _ => unreachable!(), - }; - - Ok(ArrayExpressionInner::Slice(box array, box from, box to)) - } - e => fold_array_expression_inner(self, ty, e), - } - } - - fn fold_struct_expression_inner( - &mut self, - ty: &StructType<'ast, T>, - e: StructExpressionInner<'ast, T>, - ) -> Result, Self::Error> { - match e { - StructExpressionInner::Select(box array, box index) => self - .check_select::<_, StructExpression<_>>(array, index) - .map(|a| a.into_inner()), - e => fold_struct_expression_inner(self, ty, e), - } - } - - fn fold_field_expression( - &mut self, - e: FieldElementExpression<'ast, T>, - ) -> Result, Self::Error> { - match e { - FieldElementExpression::Select(box array, box index) => self.check_select(array, index), - e => fold_field_expression(self, e), - } - } - - fn fold_boolean_expression( - &mut self, - e: BooleanExpression<'ast, T>, - ) -> Result, Self::Error> { - match e { - BooleanExpression::Select(box array, box index) => self.check_select(array, index), - e => fold_boolean_expression(self, e), - } - } - - fn fold_uint_expression_inner( - &mut self, - bitwidth: UBitwidth, - e: UExpressionInner<'ast, T>, - ) -> Result, Self::Error> { - match e { - UExpressionInner::Select(box array, box index) => self - .check_select::<_, UExpression<_>>(array, index) - .map(|a| a.into_inner()), - e => fold_uint_expression_inner(self, bitwidth, e), - } - } -} diff --git a/zokrates_core/src/static_analysis/mod.rs b/zokrates_core/src/static_analysis/mod.rs index 4b91e49e..19c2ff03 100644 --- a/zokrates_core/src/static_analysis/mod.rs +++ b/zokrates_core/src/static_analysis/mod.rs @@ -4,7 +4,6 @@ //! @author Thibaut Schaeffer //! @date 2018 -mod bounds_checker; mod constant_inliner; mod flat_propagation; mod flatten_complex_types; @@ -17,7 +16,6 @@ mod unconstrained_vars; mod variable_read_remover; mod variable_write_remover; -use self::bounds_checker::BoundsChecker; use self::flatten_complex_types::Flattener; use self::propagation::Propagator; use self::redefinition::RedefinitionOptimizer; @@ -90,8 +88,6 @@ impl<'ast, T: Field> TypedProgram<'ast, T> { let r = VariableWriteRemover::apply(r); // remove variable access to complex types let r = VariableReadRemover::apply(r); - // check array accesses are in bounds - let r = BoundsChecker::check(r).map_err(Error::from)?; // detect non constant shifts let r = ShiftChecker::check(r).map_err(Error::from)?; // convert to zir, removing complex types