Skip to content

Commit

Permalink
[dartfuzz] Adding fuzzing support for more core types
Browse files Browse the repository at this point in the history
Change-Id: Id377a58a54cb17cb3e7e337efb9de01d237aa5a3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/128766
Reviewed-by: Aart Bik <ajcbik@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
Commit-Queue: Fizaa Luthra <fizaaluthra@google.com>
  • Loading branch information
Fizaa Luthra authored and commit-bot@chromium.org committed Dec 19, 2019
1 parent d0049dd commit 141fcfa
Show file tree
Hide file tree
Showing 5 changed files with 138,022 additions and 2,412 deletions.
12 changes: 10 additions & 2 deletions runtime/tools/dartfuzz/dartfuzz.dart
Expand Up @@ -14,7 +14,7 @@ import 'dartfuzz_type_table.dart';
// Version of DartFuzz. Increase this each time changes are made
// to preserve the property that a given version of DartFuzz yields
// the same fuzzed program for a deterministic random seed.
const String version = '1.80';
const String version = '1.81';

// Restriction on statements and expressions.
const int stmtDepth = 1;
Expand Down Expand Up @@ -1472,6 +1472,8 @@ class DartFuzz {

void emitBool() => emit(coinFlip() ? 'true' : 'false');

void emitNull() => emit("null");

void emitSmallPositiveInt({int limit = 50, bool includeSemicolon = false}) {
emit('${choose(limit)}');
if (includeSemicolon) {
Expand Down Expand Up @@ -1680,7 +1682,9 @@ class DartFuzz {
{bool smallPositiveValue = false, RhsFilter rhsFilter}) {
// Randomly specialize interface if possible. E.g. num to int.
tp = maybeSpecializeInterface(tp);
if (tp == DartType.BOOL) {
if (tp == DartType.NULL) {
emitNull();
} else if (tp == DartType.BOOL) {
emitBool();
} else if (tp == DartType.INT) {
if (smallPositiveValue) {
Expand All @@ -1694,6 +1698,10 @@ class DartFuzz {
emitNum(smallPositiveValue: smallPositiveValue);
} else if (tp == DartType.STRING) {
emitString();
} else if (tp == DartType.ENDIAN) {
// The Endian type doesn't have a public constructor, so we emit a
// library call instead.
emitLibraryCall(depth, tp);
} else if (dartType.constructors(tp).isNotEmpty) {
// Constructors serve as literals for non trivially constructable types.
// Important note: We have to test for existence of a non trivial
Expand Down
95 changes: 95 additions & 0 deletions runtime/tools/dartfuzz/dartfuzz_api_table.dart
Expand Up @@ -29,7 +29,9 @@ class DartLib {

static final typeToLibraryMethods = {
DartType.BOOL: boolLibs,
DartType.DEPRECATED: deprecatedLibs,
DartType.DOUBLE: doubleLibs,
DartType.ENDIAN: endianLibs,
DartType.FLOAT32LIST: float32ListLibs,
DartType.FLOAT32X4: float32x4Libs,
DartType.FLOAT32X4LIST: float32x4ListLibs,
Expand All @@ -45,8 +47,12 @@ class DartLib {
DartType.INT8LIST: int8ListLibs,
DartType.LIST_INT: listLibs,
DartType.MAP_INT_STRING: mapLibs,
DartType.NULL: nullLibs,
DartType.RUNEITERATOR: runeIteratorLibs,
DartType.RUNES: runesLibs,
DartType.SET_INT: setLibs,
DartType.STRING: stringLibs,
DartType.SYMBOL: symbolLibs,
DartType.UINT16LIST: uint16ListLibs,
DartType.UINT32LIST: uint32ListLibs,
DartType.UINT64LIST: uint64ListLibs,
Expand Down Expand Up @@ -74,16 +80,29 @@ class DartLib {
DartLib('flagX', [DartType.INT32X4, DartType.VOID], false),
DartLib('flagY', [DartType.INT32X4, DartType.VOID], false),
DartLib('flagZ', [DartType.INT32X4, DartType.VOID], false),
DartLib('hasMatch', [DartType.REGEXP, DartType.STRING], true),
DartLib('isCaseSensitive', [DartType.REGEXP, DartType.VOID], false),
DartLib('isDotAll', [DartType.REGEXP, DartType.VOID], false),
DartLib('isEmpty', [DartType.MAP_INT_STRING, DartType.VOID], false),
DartLib('isEmpty', [DartType.STRINGBUFFER, DartType.VOID], false),
DartLib('isEmpty', [DartType.STRING, DartType.VOID], false),
DartLib('isEven', [DartType.INT, DartType.VOID], false),
DartLib('isFinite', [DartType.DOUBLE, DartType.VOID], false),
DartLib('isInfinite', [DartType.DOUBLE, DartType.VOID], false),
DartLib('isMultiLine', [DartType.REGEXP, DartType.VOID], false),
DartLib('isNaN', [DartType.DOUBLE, DartType.VOID], false),
DartLib('isNegative', [DartType.DOUBLE, DartType.VOID], false),
DartLib('isNotEmpty', [DartType.MAP_INT_STRING, DartType.VOID], false),
DartLib('isNotEmpty', [DartType.STRINGBUFFER, DartType.VOID], false),
DartLib('isNotEmpty', [DartType.STRING, DartType.VOID], false),
DartLib('isOdd', [DartType.INT, DartType.VOID], false),
DartLib('isRunning', [DartType.STOPWATCH, DartType.VOID], false),
DartLib('isUnicode', [DartType.REGEXP, DartType.VOID], false),
DartLib('moveNext', [DartType.RUNEITERATOR, DartType.VOID], true),
DartLib('movePrevious', [DartType.RUNEITERATOR, DartType.VOID], true),
];
static const deprecatedLibs = [
DartLib('deprecated', [DartType.VOID, DartType.VOID], false),
];
static const doubleLibs = [
DartLib('abs', [DartType.DOUBLE, DartType.VOID], true),
Expand All @@ -104,6 +123,7 @@ class DartLib {
DartLib('double.negativeInfinity', [DartType.VOID, DartType.VOID], false),
DartLib('double.tryParse', [DartType.VOID, DartType.STRING], true),
DartLib('e', [DartType.VOID, DartType.VOID], false),
DartLib('end', [DartType.RANGEERROR, DartType.VOID], false),
DartLib('exp', [DartType.VOID, DartType.DOUBLE], true),
DartLib('floorToDouble', [DartType.DOUBLE, DartType.VOID], true),
DartLib('floorToDouble', [DartType.DOUBLE, DartType.VOID], true),
Expand All @@ -127,6 +147,7 @@ class DartLib {
DartLib('sqrt', [DartType.VOID, DartType.DOUBLE], true),
DartLib('sqrt1_2', [DartType.VOID, DartType.VOID], false),
DartLib('sqrt2', [DartType.VOID, DartType.VOID], false),
DartLib('start', [DartType.RANGEERROR, DartType.VOID], false),
DartLib('tan', [DartType.VOID, DartType.DOUBLE], true),
DartLib('toDouble', [DartType.DOUBLE, DartType.VOID], true),
DartLib('truncateToDouble', [DartType.DOUBLE, DartType.VOID], true),
Expand All @@ -139,6 +160,11 @@ class DartLib {
DartLib('y', [DartType.FLOAT64X2, DartType.VOID], false),
DartLib('z', [DartType.FLOAT32X4, DartType.VOID], false),
];
static const endianLibs = [
DartLib('Endian.big', [DartType.VOID, DartType.VOID], false),
DartLib('Endian.host', [DartType.VOID, DartType.VOID], false),
DartLib('Endian.little', [DartType.VOID, DartType.VOID], false),
];
static const float32ListLibs = [
DartLib(
'sublist', [DartType.FLOAT32LIST, DartType.INT, DartType.INT], true),
Expand Down Expand Up @@ -850,21 +876,33 @@ class DartLib {
DartLib('codeUnitAt', [DartType.STRING, DartType.INT], true),
DartLib('compareTo', [DartType.DOUBLE, DartType.DOUBLE], true),
DartLib('compareTo', [DartType.STRING, DartType.STRING], true),
DartLib('current', [DartType.RUNEITERATOR, DartType.VOID], false),
DartLib('currentSize', [DartType.RUNEITERATOR, DartType.VOID], false),
DartLib('elapsedMicroseconds', [DartType.STOPWATCH, DartType.VOID], false),
DartLib('elapsedMilliseconds', [DartType.STOPWATCH, DartType.VOID], false),
DartLib('elapsedTicks', [DartType.STOPWATCH, DartType.VOID], false),
DartLib('end', [DartType.INDEXERROR, DartType.VOID], false),
DartLib('floor', [DartType.DOUBLE, DartType.VOID], true),
DartLib('floor', [DartType.DOUBLE, DartType.VOID], true),
DartLib('floor', [DartType.INT, DartType.VOID], true),
DartLib('frequency', [DartType.STOPWATCH, DartType.VOID], false),
DartLib('gcd', [DartType.INT, DartType.INT], true),
DartLib('indexOf', [DartType.LIST_INT, DartType.INT, DartType.INT], true),
DartLib('int.fromEnvironment', [DartType.VOID, DartType.STRING], true),
DartLib('int.parse', [DartType.VOID, DartType.STRING], true),
DartLib('int.tryParse', [DartType.VOID, DartType.STRING], true),
DartLib('last', [DartType.RUNES, DartType.VOID], false),
DartLib(
'lastIndexOf', [DartType.LIST_INT, DartType.INT, DartType.INT], true),
DartLib('length', [DartType.INDEXERROR, DartType.VOID], false),
DartLib('length', [DartType.LIST_INT, DartType.VOID], false),
DartLib('length', [DartType.MAP_INT_STRING, DartType.VOID], false),
DartLib('length', [DartType.STRINGBUFFER, DartType.VOID], false),
DartLib('length', [DartType.STRING, DartType.VOID], false),
DartLib('modInverse', [DartType.INT, DartType.INT], true),
DartLib('modPow', [DartType.INT, DartType.INT, DartType.INT], true),
DartLib('offset', [DartType.FORMATEXCEPTION, DartType.VOID], false),
DartLib('rawIndex', [DartType.RUNEITERATOR, DartType.VOID], false),
DartLib('removeAt', [DartType.LIST_INT, DartType.INT], true),
DartLib('removeLast', [DartType.LIST_INT, DartType.VOID], true),
DartLib('round', [DartType.DOUBLE, DartType.VOID], true),
Expand All @@ -874,6 +912,7 @@ class DartLib {
DartLib('signMask', [DartType.FLOAT32X4, DartType.VOID], false),
DartLib('signMask', [DartType.FLOAT64X2, DartType.VOID], false),
DartLib('signMask', [DartType.INT32X4, DartType.VOID], false),
DartLib('start', [DartType.INDEXERROR, DartType.VOID], false),
DartLib('toInt', [DartType.DOUBLE, DartType.VOID], true),
DartLib('toSigned', [DartType.INT, DartType.INT], true),
DartLib('toUnsigned', [DartType.INT, DartType.INT], true),
Expand Down Expand Up @@ -959,6 +998,15 @@ class DartLib {
DartLib('Map<int, String>.unmodifiable',
[DartType.VOID, DartType.MAP_INT_STRING], true),
];
static const nullLibs = [
DartLib('provisional', [DartType.VOID, DartType.VOID], false),
];
static const runeIteratorLibs = [
DartLib('iterator', [DartType.RUNES, DartType.VOID], false),
];
static const runesLibs = [
DartLib('runes', [DartType.STRING, DartType.VOID], false),
];
static const setLibs = [
DartLib('Set<int>.identity', [DartType.VOID, DartType.VOID], true),
DartLib('difference', [DartType.SET_INT, DartType.SET_INT], true),
Expand All @@ -982,26 +1030,67 @@ class DartLib {
DartLib('Uri.encodeQueryComponent', [DartType.VOID, DartType.STRING], true),
DartLib('base64Encode', [DartType.VOID, DartType.LIST_INT], true),
DartLib('base64UrlEncode', [DartType.VOID, DartType.LIST_INT], true),
DartLib('currentAsString', [DartType.RUNEITERATOR, DartType.VOID], false),
DartLib('expires', [DartType.DEPRECATED, DartType.VOID], false),
DartLib('message', [DartType.DEPRECATED, DartType.VOID], false),
DartLib('message', [DartType.FORMATEXCEPTION, DartType.VOID], false),
DartLib('message', [DartType.PROVISIONAL, DartType.VOID], false),
DartLib('message', [DartType.STATEERROR, DartType.VOID], false),
DartLib('message', [DartType.UNIMPLEMENTEDERROR, DartType.VOID], false),
DartLib('message', [DartType.UNSUPPORTEDERROR, DartType.VOID], false),
DartLib('name', [DartType.ARGUMENTERROR, DartType.VOID], false),
DartLib('padLeft', [DartType.STRING, DartType.INT, DartType.STRING], true,
restrictions: [Restriction.none, Restriction.small, Restriction.small]),
DartLib('padRight', [DartType.STRING, DartType.INT, DartType.STRING], true,
restrictions: [Restriction.none, Restriction.small, Restriction.small]),
DartLib('pattern', [DartType.REGEXP, DartType.VOID], false),
DartLib('replaceRange',
[DartType.STRING, DartType.INT, DartType.INT, DartType.STRING], true),
DartLib('string', [DartType.RUNEITERATOR, DartType.VOID], false),
DartLib('string', [DartType.RUNES, DartType.VOID], false),
DartLib('stringMatch', [DartType.REGEXP, DartType.STRING], true),
DartLib('substring', [DartType.STRING, DartType.INT, DartType.INT], true),
DartLib('toLowerCase', [DartType.STRING, DartType.VOID], true),
DartLib('toRadixString', [DartType.INT, DartType.INT], true),
DartLib('toString',
[DartType.ABSTRACTCLASSINSTANTIATIONERROR, DartType.VOID], true),
DartLib('toString', [DartType.ARGUMENTERROR, DartType.VOID], true),
DartLib('toString', [DartType.BOOL, DartType.VOID], true),
DartLib('toString', [DartType.CONCURRENTMODIFICATIONERROR, DartType.VOID],
true),
DartLib(
'toString', [DartType.CYCLICINITIALIZATIONERROR, DartType.VOID], true),
DartLib('toString', [DartType.DEPRECATED, DartType.VOID], true),
DartLib('toString', [DartType.DOUBLE, DartType.VOID], true),
DartLib('toString', [DartType.DOUBLE, DartType.VOID], true),
DartLib('toString', [DartType.ERROR, DartType.VOID], true),
DartLib('toString', [DartType.FALLTHROUGHERROR, DartType.VOID], true),
DartLib('toString', [DartType.FORMATEXCEPTION, DartType.VOID], true),
DartLib('toString', [DartType.INT, DartType.VOID], true),
DartLib('toString',
[DartType.INTEGERDIVISIONBYZEROEXCEPTION, DartType.VOID], true),
DartLib('toString', [DartType.MAPENTRY_INT_STRING, DartType.VOID], true),
DartLib('toString', [DartType.NULL, DartType.VOID], true),
DartLib('toString', [DartType.NULLTHROWNERROR, DartType.VOID], true),
DartLib('toString', [DartType.OUTOFMEMORYERROR, DartType.VOID], true),
DartLib('toString', [DartType.STACKOVERFLOWERROR, DartType.VOID], true),
DartLib('toString', [DartType.STATEERROR, DartType.VOID], true),
DartLib('toString', [DartType.STRINGBUFFER, DartType.VOID], true),
DartLib('toString', [DartType.UNIMPLEMENTEDERROR, DartType.VOID], true),
DartLib('toString', [DartType.UNSUPPORTEDERROR, DartType.VOID], true),
DartLib('toStringAsExponential', [DartType.DOUBLE, DartType.INT], true),
DartLib('toStringAsFixed', [DartType.DOUBLE, DartType.INT], true),
DartLib('toStringAsPrecision', [DartType.DOUBLE, DartType.INT], true),
DartLib('toUpperCase', [DartType.STRING, DartType.VOID], true),
DartLib('trim', [DartType.STRING, DartType.VOID], true),
DartLib('trimLeft', [DartType.STRING, DartType.VOID], true),
DartLib('trimRight', [DartType.STRING, DartType.VOID], true),
DartLib('variableName', [DartType.CYCLICINITIALIZATIONERROR, DartType.VOID],
false),
];
static const symbolLibs = [
DartLib('Symbol.empty', [DartType.VOID, DartType.VOID], false),
DartLib('Symbol.unaryMinus', [DartType.VOID, DartType.VOID], false),
];
static const uint16ListLibs = [
DartLib('Uint16List.fromList', [DartType.VOID, DartType.LIST_INT], true),
Expand Down Expand Up @@ -1045,10 +1134,16 @@ class DartLib {
DartLib('clear', [DartType.LIST_INT, DartType.VOID], true),
DartLib('clear', [DartType.MAP_INT_STRING, DartType.VOID], true),
DartLib('clear', [DartType.SET_INT, DartType.VOID], true),
DartLib('clear', [DartType.STRINGBUFFER, DartType.VOID], true),
DartLib('fillRange',
[DartType.LIST_INT, DartType.INT, DartType.INT, DartType.INT], true),
DartLib('insert', [DartType.LIST_INT, DartType.INT, DartType.INT], true),
DartLib(
'removeRange', [DartType.LIST_INT, DartType.INT, DartType.INT], true),
DartLib('reset', [DartType.RUNEITERATOR, DartType.INT], true),
DartLib('reset', [DartType.STOPWATCH, DartType.VOID], true),
DartLib('start', [DartType.STOPWATCH, DartType.VOID], true),
DartLib('stop', [DartType.STOPWATCH, DartType.VOID], true),
DartLib('writeCharCode', [DartType.STRINGBUFFER, DartType.INT], true),
];
}

0 comments on commit 141fcfa

Please sign in to comment.