From 38d5c5e444cf53567356df1bfc8a117130c7a52e Mon Sep 17 00:00:00 2001 From: Daco Harkes Date: Tue, 30 Mar 2021 00:12:49 +0000 Subject: [PATCH] [vm/ffi] Array range error message Closes: https://github.com/dart-lang/sdk/issues/45189 Change-Id: I225a092fd05efe8a6eed7749375ea4c842547fb7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/193404 Auto-Submit: Daco Harkes Reviewed-by: Siva Annamalai Commit-Queue: Siva Annamalai --- sdk/lib/_internal/vm/lib/ffi_patch.dart | 2 +- tests/ffi/regress_45189_test.dart | 26 +++++++++++++++++++++++++ tests/ffi_2/regress_45189_test.dart | 26 +++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 tests/ffi/regress_45189_test.dart create mode 100644 tests/ffi_2/regress_45189_test.dart diff --git a/sdk/lib/_internal/vm/lib/ffi_patch.dart b/sdk/lib/_internal/vm/lib/ffi_patch.dart index 75a6e51519b..d2b0d0a7e00 100644 --- a/sdk/lib/_internal/vm/lib/ffi_patch.dart +++ b/sdk/lib/_internal/vm/lib/ffi_patch.dart @@ -129,7 +129,7 @@ class Array { _checkIndex(int index) { if (index < 0 || index >= _size) { - throw RangeError.range(index, 0, _size); + throw RangeError.range(index, 0, _size - 1); } } diff --git a/tests/ffi/regress_45189_test.dart b/tests/ffi/regress_45189_test.dart new file mode 100644 index 00000000000..980d1bcfa41 --- /dev/null +++ b/tests/ffi/regress_45189_test.dart @@ -0,0 +1,26 @@ +// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import "dart:ffi"; + +import "package:ffi/ffi.dart"; +import 'package:expect/expect.dart'; + +class Struct8BytesInlineArrayInt extends Struct { + @Array(8) + external Array a0; +} + +void main() { + final pointer = calloc(); + final array = pointer.ref.a0; + try { + array[8]; // RangeError: Invalid value: Not in inclusive range 0..8: 8 + } on RangeError catch (exception) { + final toString = exception.toString(); + Expect.equals( + "RangeError: Invalid value: Not in inclusive range 0..7: 8", toString); + } + calloc.free(pointer); +} diff --git a/tests/ffi_2/regress_45189_test.dart b/tests/ffi_2/regress_45189_test.dart new file mode 100644 index 00000000000..1aff90bc8e7 --- /dev/null +++ b/tests/ffi_2/regress_45189_test.dart @@ -0,0 +1,26 @@ +// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import "dart:ffi"; + +import "package:ffi/ffi.dart"; +import 'package:expect/expect.dart'; + +class Struct8BytesInlineArrayInt extends Struct { + @Array(8) + Array a0; +} + +void main() { + final pointer = calloc(); + final array = pointer.ref.a0; + try { + array[8]; // RangeError: Invalid value: Not in inclusive range 0..8: 8 + } on RangeError catch (exception) { + final toString = exception.toString(); + Expect.equals( + "RangeError: Invalid value: Not in inclusive range 0..7: 8", toString); + } + calloc.free(pointer); +}