From e1be00f06d8937f876b0163fa9c047a50f823855 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Tue, 14 Oct 2025 13:58:02 +0100 Subject: [PATCH 1/3] Add integration test --- .../execution_success/regression_10180/Nargo.toml | 6 ++++++ .../execution_success/regression_10180/Prover.toml | 2 ++ .../execution_success/regression_10180/src/main.nr | 12 ++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 test_programs/execution_success/regression_10180/Nargo.toml create mode 100644 test_programs/execution_success/regression_10180/Prover.toml create mode 100644 test_programs/execution_success/regression_10180/src/main.nr diff --git a/test_programs/execution_success/regression_10180/Nargo.toml b/test_programs/execution_success/regression_10180/Nargo.toml new file mode 100644 index 00000000000..7b68c0c84d4 --- /dev/null +++ b/test_programs/execution_success/regression_10180/Nargo.toml @@ -0,0 +1,6 @@ +[package] +name = "regression_10180" +type = "bin" +authors = [""] + +[dependencies] \ No newline at end of file diff --git a/test_programs/execution_success/regression_10180/Prover.toml b/test_programs/execution_success/regression_10180/Prover.toml new file mode 100644 index 00000000000..f0c44d10ce0 --- /dev/null +++ b/test_programs/execution_success/regression_10180/Prover.toml @@ -0,0 +1,2 @@ +b = true +return = 193432430920915057603408161267722629873 diff --git a/test_programs/execution_success/regression_10180/src/main.nr b/test_programs/execution_success/regression_10180/src/main.nr new file mode 100644 index 00000000000..f2dc1124857 --- /dev/null +++ b/test_programs/execution_success/regression_10180/src/main.nr @@ -0,0 +1,12 @@ +global G_B: [(str<2>, Field)] = &[ + ("SM", 193432430920915057603408161267722629873), + ("QK", 28517051330822917784420357897851281178), + ("XJ", -303354957477210748157621923488550325890), +]; +fn main(b: bool) -> pub Field { + if b { + G_B[(1783103175_u32 % G_B.len())].1 + } else { + (G_B[1771627614_u32].1 / G_B[2334904280_u32].1) + } +} From 89f883a620e20e7f1e8097f7135ac992d3c19d25 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Tue, 14 Oct 2025 13:58:22 +0100 Subject: [PATCH 2/3] Do not return IndexOutOfBounds on overflow if side effects are disabled --- .../src/ssa/interpreter/mod.rs | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/compiler/noirc_evaluator/src/ssa/interpreter/mod.rs b/compiler/noirc_evaluator/src/ssa/interpreter/mod.rs index 2b09a14c98f..6727fb69d40 100644 --- a/compiler/noirc_evaluator/src/ssa/interpreter/mod.rs +++ b/compiler/noirc_evaluator/src/ssa/interpreter/mod.rs @@ -964,13 +964,27 @@ impl<'ssa, W: Write> Interpreter<'ssa, W> { result: ValueId, side_effects_enabled: bool, ) -> IResult<()> { + // When there is a problem indexing the array, but side effects are disabled, + // define the value as uninitialized. + let uninitialized = |this: &mut Self| { + let typ = this.dfg().type_of_value(result); + let value = Value::uninitialized(&typ, result); + this.define(result, value) + }; + let offset = self.dfg().array_offset(array, index); let array = self.lookup_array_or_slice(array, "array get")?; let length = array.elements.borrow().len() as u32; - let index = self.lookup_array_index(index, "array get index", length)?; + + let index = match self.lookup_array_index(index, "array get index", length) { + Err(InterpreterError::IndexOutOfBounds { .. }) if !side_effects_enabled => { + return uninitialized(self); + } + other => other?, + }; let mut index = index - offset.to_u32(); - let element = if length == 0 { + if length == 0 { // Accessing an array of 0-len is replaced by asserting // the branch is not-taken during acir-gen and // a zeroed type is used in case of array get @@ -978,10 +992,11 @@ impl<'ssa, W: Write> Interpreter<'ssa, W> { if side_effects_enabled { return Err(InterpreterError::IndexOutOfBounds { index: index.into(), length }); } else { - let typ = self.dfg().type_of_value(result); - Value::uninitialized(&typ, result) + return uninitialized(self); } - } else { + } + + let element = { // An array_get with false side_effects_enabled is replaced // by a load at a valid index during acir-gen. if !side_effects_enabled { From 5a1dc6e860518871d9957fea66208002dd0222f0 Mon Sep 17 00:00:00 2001 From: Akosh Farkash Date: Tue, 14 Oct 2025 14:05:47 +0100 Subject: [PATCH 3/3] Add insta --- .../regression_10180/Prover.toml | 2 +- .../execute__tests__expanded.snap | 17 +++++++++++++++++ .../execute__tests__stdout.snap | 5 +++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 tooling/nargo_cli/tests/snapshots/execution_success/regression_10180/execute__tests__expanded.snap create mode 100644 tooling/nargo_cli/tests/snapshots/execution_success/regression_10180/execute__tests__stdout.snap diff --git a/test_programs/execution_success/regression_10180/Prover.toml b/test_programs/execution_success/regression_10180/Prover.toml index f0c44d10ce0..458d4bce321 100644 --- a/test_programs/execution_success/regression_10180/Prover.toml +++ b/test_programs/execution_success/regression_10180/Prover.toml @@ -1,2 +1,2 @@ b = true -return = 193432430920915057603408161267722629873 +return = "193432430920915057603408161267722629873" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_10180/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_10180/execute__tests__expanded.snap new file mode 100644 index 00000000000..275259d9154 --- /dev/null +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_10180/execute__tests__expanded.snap @@ -0,0 +1,17 @@ +--- +source: tooling/nargo_cli/tests/execute.rs +expression: expanded_code +--- +global G_B: [(str<2>, Field)] = &[ + ("SM", 193432430920915057603408161267722629873), + ("QK", 28517051330822917784420357897851281178), + ("XJ", -303354957477210748157621923488550325890), +]; + +fn main(b: bool) -> pub Field { + if b { + G_B[1783103175_u32 % G_B.len()].1 + } else { + G_B[1771627614_u32].1 / G_B[2334904280_u32].1 + } +} diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_10180/execute__tests__stdout.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_10180/execute__tests__stdout.snap new file mode 100644 index 00000000000..a289120c7a6 --- /dev/null +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_10180/execute__tests__stdout.snap @@ -0,0 +1,5 @@ +--- +source: tooling/nargo_cli/tests/execute.rs +expression: stdout +--- +[regression_10180] Circuit output: 0x9185bb28e2cfba7cb4079a5c3ada32f1