blob: 77d53bc55748bfb12e5f0ac3a8e7ed06e95dbdde [file] [log] [blame] [edit]
// 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);
}