blob: 58d3eae4c0e4d29a53cbdb30e42ae1e8bfafd6c4 [file] [log] [blame]
// Copyright (c) 2019, 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.
// VMOptions=--deterministic
import "package:expect/expect.dart";
import 'dart:typed_data';
// Found by "value-guided" DartFuzzing: incorrect clamping.
// https://github.com/dart-lang/sdk/issues/37868
@pragma("vm:never-inline")
foo(List<int> x) => Uint8ClampedList.fromList(x);
@pragma("vm:never-inline")
bar(List<int> x) => Uint8List.fromList(x);
@pragma("vm:never-inline")
baz(List<int> x) => Int8List.fromList(x);
main() {
// Proper values.
final List<int> x = [
9223372036854775807,
-9223372036854775808,
9223372032559808513,
-9223372032559808513,
5000000000,
-5000000000,
2147483647,
-2147483648,
255,
-255,
11,
-11,
0,
-1,
];
Expect.listEquals(
[255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 11, 0, 0, 0], foo(x));
Expect.listEquals(
[255, 0, 1, 255, 0, 0, 255, 0, 255, 1, 11, 245, 0, 255], bar(x));
Expect.listEquals([-1, 0, 1, -1, 0, 0, -1, 0, -1, 1, 11, -11, 0, -1], baz(x));
// Hidden null.
final List<int> a = [1, null, 2].cast<int>();
int num_exceptions = 0;
try {
foo(a);
} catch (e) {
// In strong mode, .cast() throws a TypeError when casting to int. In weak
// mode, that cast succeeds and then NoSuchMethod is thrown later when the
// null is used.
Expect.isTrue(e is TypeError || e is NoSuchMethodError);
num_exceptions++;
}
try {
bar(a);
} catch (e) {
Expect.isTrue(e is TypeError || e is NoSuchMethodError);
num_exceptions++;
}
try {
baz(a);
} catch (e) {
Expect.isTrue(e is TypeError || e is NoSuchMethodError);
num_exceptions++;
}
Expect.equals(3, num_exceptions);
}