[dartfuzz] Adding fuzzing support for more core types

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>
This commit is contained in:
Fizaa Luthra 2019-12-19 22:21:13 +00:00 committed by commit-bot@chromium.org
parent d0049dd7f3
commit 141fcfa610
5 changed files with 135676 additions and 66 deletions

View file

@ -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;
@ -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) {
@ -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) {
@ -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

View file

@ -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,
@ -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,
@ -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),
@ -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),
@ -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),
@ -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),
@ -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),
@ -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),
@ -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),
@ -982,19 +1030,54 @@ 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),
@ -1002,6 +1085,12 @@ class DartLib {
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),
@ -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),
];
}

File diff suppressed because it is too large Load diff

View file

@ -42,41 +42,33 @@ class DartLib {
const DartLib(this.name, this.proto, this.restrictions, this.isMethod);
}
// Lists of recognized methods, organized by return type.
var boolTable = <DartLib>[];
var doubleTable = <DartLib>[];
var float32ListTable = <DartLib>[];
var float32x4ListTable = <DartLib>[];
var float32x4Table = <DartLib>[];
var float64ListTable = <DartLib>[];
var float64x2ListTable = <DartLib>[];
var float64x2Table = <DartLib>[];
var int16ListTable = <DartLib>[];
var int32ListTable = <DartLib>[];
var int32x4ListTable = <DartLib>[];
var int32x4Table = <DartLib>[];
var int64ListTable = <DartLib>[];
var int8ListTable = <DartLib>[];
var intTable = <DartLib>[];
var listTable = <DartLib>[];
var mapTable = <DartLib>[];
var setTable = <DartLib>[];
var stringTable = <DartLib>[];
var uint16ListTable = <DartLib>[];
var uint32ListTable = <DartLib>[];
var uint64ListTable = <DartLib>[];
var uint8ClampedListTable = <DartLib>[];
var uint8ListTable = <DartLib>[];
var voidTable = <DartLib>[];
// Constants for strings corresponding to the DartType.
const abstractClassInstantiationErrorEncoding =
'DartType.ABSTRACTCLASSINSTANTIATIONERROR';
const argumentErrorEncoding = 'DartType.ARGUMENTERROR';
const assertionErrorEncoding = 'DartType.ERROR';
const boolEncoding = 'DartType.BOOL';
const byteDataEncoding = 'DartType.BYTEDATA';
const castErrorEncoding = 'DartType.CASTERROR';
const concurrentModificationErrorEncoding =
'DartType.CONCURRENTMODIFICATIONERROR';
const cyclicInitializationErrorEncoding = 'DartType.CYCLICINITIALIZATIONERROR';
const deprecatedEncoding = 'DartType.DEPRECATED';
const doubleEncoding = 'DartType.DOUBLE';
const endianEncoding = 'DartType.ENDIAN';
const errorEncoding = 'DartType.ERROR';
const exceptionEncoding = 'DartType.EXCEPTION';
const expandoDoubleEncoding = 'DartType.EXPANDO_DOUBLE';
const expandoIntEncoding = 'DartType.EXPANDO_INT';
const fallThroughErrorEncoding = 'DartType.FALLTHROUGHERROR';
const float32ListEncoding = 'DartType.FLOAT32LIST';
const float32x4Encoding = 'DartType.FLOAT32X4';
const float32x4ListEncoding = 'DartType.FLOAT32X4LIST';
const float64ListEncoding = 'DartType.FLOAT64LIST';
const float64x2Encoding = 'DartType.FLOAT64X2';
const float64x2ListEncoding = 'DartType.FLOAT64X2LIST';
const formatExceptionEncoding = 'DartType.FORMATEXCEPTION';
const indexErrorEncoding = 'DartType.INDEXERROR';
const int16ListEncoding = 'DartType.INT16LIST';
const int32ListEncoding = 'DartType.INT32LIST';
const int32x4Encoding = 'DartType.INT32X4';
@ -84,25 +76,63 @@ const int32x4ListEncoding = 'DartType.INT32X4LIST';
const int64ListEncoding = 'DartType.INT64LIST';
const int8ListEncoding = 'DartType.INT8LIST';
const intEncoding = 'DartType.INT';
const integerDivisionByZeroExceptionEncoding =
'DartType.INTEGERDIVISIONBYZEROEXCEPTION';
const listIntEncoding = 'DartType.LIST_INT';
const mapEntryIntStringEncoding = 'DartType.MAPENTRY_INT_STRING';
const mapIntStringEncoding = 'DartType.MAP_INT_STRING';
const nullEncoding = 'DartType.NULL';
const nullThrownErrorEncoding = 'DartType.NULLTHROWNERROR';
const numEncoding = 'DartType.NUM';
const outOfMemoryErrorEncoding = 'DartType.OUTOFMEMORYERROR';
const provisionalEncoding = 'DartType.PROVISIONAL';
const rangeErrorEncoding = 'DartType.RANGEERROR';
const regExpEncoding = 'DartType.REGEXP';
const runeIteratorEncoding = 'DartType.RUNEITERATOR';
const runesEncoding = 'DartType.RUNES';
const setIntEncoding = 'DartType.SET_INT';
const stackOverflowErrorEncoding = 'DartType.STACKOVERFLOWERROR';
const stateErrorEncoding = 'DartType.STATEERROR';
const stopwatchEncoding = 'DartType.STOPWATCH';
const stringBufferEncoding = 'DartType.STRINGBUFFER';
const stringEncoding = 'DartType.STRING';
const symbolEncoding = 'DartType.SYMBOL';
const typeErrorEncoding = 'DartType.TYPEERROR';
const uint16ListEncoding = 'DartType.UINT16LIST';
const uint32ListEncoding = 'DartType.UINT32LIST';
const uint64ListEncoding = 'DartType.UINT64LIST';
const uint8ClampedListEncoding = 'DartType.UINT8CLAMPEDLIST';
const uint8ListEncoding = 'DartType.UINT8LIST';
const unimplementedErrorEncoding = 'DartType.UNIMPLEMENTEDERROR';
const unsupportedErrorEncoding = 'DartType.UNSUPPORTEDERROR';
const voidEncoding = 'DartType.VOID';
// Constants for the library methods lists' names in dart_api_table.dart.
final abstractClassInstantiationErrorLibs =
'abstractClassInstantiationErrorLibs';
final argumentErrorLibs = 'argumentErrorLibs';
final assertionErrorLibs = 'assertionErrorLibs';
final boolLibs = 'boolLibs';
final byteDataLibs = 'byteDataLibs';
final castErrorLibs = 'castErrorLibs';
final concurrentModificationErrorLibs = 'concurrentModificationErrorLibs';
final cyclicInitializationErrorLibs = 'cyclicInitializationErrorLibs';
final deprecatedLibs = 'deprecatedLibs';
final doubleLibs = 'doubleLibs';
final endianLibs = 'endianLibs';
final errorLibs = 'errorLibs';
final exceptionLibs = 'exceptionLibs';
final expandoDoubleLibs = 'expandoDoubleLibs';
final expandoIntLibs = 'expandoIntLibs';
final fallThroughErrorLibs = 'fallThroughErrorLibs';
final float32ListLibs = 'float32ListLibs';
final float32x4Libs = 'float32x4Libs';
final float32x4ListLibs = 'float32x4ListLibs';
final float64ListLibs = 'float64ListLibs';
final float64x2Libs = 'float64x2Libs';
final float64x2ListLibs = 'float64x2ListLibs';
final formatExceptionLibs = 'formatExceptionLibs';
final indexErrorLibs = 'indexErrorLibs';
final int16ListLibs = 'int16ListLibs';
final int32ListLibs = 'int32ListLibs';
final int32x4Libs = 'int32x4Libs';
@ -110,26 +140,62 @@ final int32x4ListLibs = 'int32x4ListLibs';
final int64ListLibs = 'int64ListLibs';
final int8ListLibs = 'int8ListLibs';
final intLibs = 'intLibs';
final integerDivisionByZeroExceptionLibs = 'integerDivisionByZeroExceptionLibs';
final listLibs = 'listLibs';
final mapEntryIntStringLibs = 'mapEntryIntStringLibs';
final mapLibs = 'mapLibs';
final nullLibs = 'nullLibs';
final nullThrownErrorLibs = 'nullThrownErrorLibs';
final numLibs = 'numLibs';
final outOfMemoryErrorLibs = 'outOfMemoryErrorLibs';
final provisionalLibs = 'provisionalLibs';
final rangeErrorLibs = 'rangeErrorLibs';
final regExpLibs = 'regExpLibs';
final runeIteratorLibs = 'runeIteratorLibs';
final runesLibs = 'runesLibs';
final setLibs = 'setLibs';
final stackOverflowErrorLibs = 'stackOverflowErrorLibs';
final stateErrorLibs = 'stateErrorLibs';
final stopwatchLibs = 'stopwatchLibs';
final stringBufferLibs = 'stringBufferLibs';
final stringLibs = 'stringLibs';
final symbolLibs = 'symbolLibs';
final typeErrorLibs = 'typeErrorLibs';
final uint16ListLibs = 'uint16ListLibs';
final uint32ListLibs = 'uint32ListLibs';
final uint64ListLibs = 'uint64ListLibs';
final uint8ClampedListLibs = 'uint8ClampedListLibs';
final uint8ListLibs = 'uint8ListLibs';
final unimplementedErrorLibs = 'unimplementedErrorLibs';
final unsupportedErrorLibs = 'unsupportedErrorLibs';
final voidLibs = 'voidLibs';
// Map from the DartType (string) to the name of the library methods list.
final Map<String, String> typeToLibraryMethodsListName = {
abstractClassInstantiationErrorEncoding: abstractClassInstantiationErrorLibs,
argumentErrorEncoding: argumentErrorLibs,
assertionErrorEncoding: assertionErrorLibs,
boolEncoding: boolLibs,
byteDataEncoding: byteDataLibs,
castErrorEncoding: castErrorLibs,
concurrentModificationErrorEncoding: concurrentModificationErrorLibs,
cyclicInitializationErrorEncoding: cyclicInitializationErrorLibs,
deprecatedEncoding: deprecatedLibs,
doubleEncoding: doubleLibs,
endianEncoding: endianLibs,
errorEncoding: errorLibs,
exceptionEncoding: exceptionLibs,
expandoDoubleEncoding: expandoDoubleLibs,
expandoIntEncoding: expandoIntLibs,
fallThroughErrorEncoding: fallThroughErrorLibs,
float32ListEncoding: float32ListLibs,
float32x4Encoding: float32x4Libs,
float32x4ListEncoding: float32x4ListLibs,
float64ListEncoding: float64ListLibs,
float64x2Encoding: float64x2Libs,
float64x2ListEncoding: float64x2ListLibs,
formatExceptionEncoding: formatExceptionLibs,
indexErrorEncoding: indexErrorLibs,
int16ListEncoding: int16ListLibs,
int32ListEncoding: int32ListLibs,
int32x4Encoding: int32x4Libs,
@ -137,27 +203,65 @@ final Map<String, String> typeToLibraryMethodsListName = {
int64ListEncoding: int64ListLibs,
int8ListEncoding: int8ListLibs,
intEncoding: intLibs,
integerDivisionByZeroExceptionEncoding: integerDivisionByZeroExceptionLibs,
listIntEncoding: listLibs,
mapEntryIntStringEncoding: mapEntryIntStringLibs,
mapIntStringEncoding: mapLibs,
nullEncoding: nullLibs,
nullThrownErrorEncoding: nullThrownErrorLibs,
numEncoding: numLibs,
outOfMemoryErrorEncoding: outOfMemoryErrorLibs,
provisionalEncoding: provisionalLibs,
rangeErrorEncoding: rangeErrorLibs,
regExpEncoding: regExpLibs,
runeIteratorEncoding: runeIteratorLibs,
runesEncoding: runesLibs,
setIntEncoding: setLibs,
stackOverflowErrorEncoding: stackOverflowErrorLibs,
stateErrorEncoding: stateErrorLibs,
stopwatchEncoding: stopwatchLibs,
stringBufferEncoding: stringBufferLibs,
stringEncoding: stringLibs,
stringEncoding: stringLibs,
symbolEncoding: symbolLibs,
typeErrorEncoding: typeErrorLibs,
uint16ListEncoding: uint16ListLibs,
uint32ListEncoding: uint32ListLibs,
uint64ListEncoding: uint64ListLibs,
uint8ClampedListEncoding: uint8ClampedListLibs,
uint8ListEncoding: uint8ListLibs,
unimplementedErrorEncoding: unimplementedErrorLibs,
unsupportedErrorEncoding: unsupportedErrorLibs,
voidEncoding: voidLibs
};
// Map from return type encoding to list of recognized methods with that
// return type.
final Map<String, List<DartLib>> typeToLibraryMethodsList = {
abstractClassInstantiationErrorEncoding: <DartLib>[],
argumentErrorEncoding: <DartLib>[],
assertionErrorEncoding: <DartLib>[],
boolEncoding: <DartLib>[],
byteDataEncoding: <DartLib>[],
castErrorEncoding: <DartLib>[],
concurrentModificationErrorEncoding: <DartLib>[],
cyclicInitializationErrorEncoding: <DartLib>[],
deprecatedEncoding: <DartLib>[],
doubleEncoding: <DartLib>[],
endianEncoding: <DartLib>[],
errorEncoding: <DartLib>[],
exceptionEncoding: <DartLib>[],
expandoDoubleEncoding: <DartLib>[],
expandoIntEncoding: <DartLib>[],
fallThroughErrorEncoding: <DartLib>[],
float32ListEncoding: <DartLib>[],
float32x4Encoding: <DartLib>[],
float32x4ListEncoding: <DartLib>[],
float64ListEncoding: <DartLib>[],
float64x2Encoding: <DartLib>[],
float64x2ListEncoding: <DartLib>[],
formatExceptionEncoding: <DartLib>[],
indexErrorEncoding: <DartLib>[],
int16ListEncoding: <DartLib>[],
int32ListEncoding: <DartLib>[],
int32x4Encoding: <DartLib>[],
@ -165,15 +269,34 @@ final Map<String, List<DartLib>> typeToLibraryMethodsList = {
int64ListEncoding: <DartLib>[],
int8ListEncoding: <DartLib>[],
intEncoding: <DartLib>[],
integerDivisionByZeroExceptionEncoding: <DartLib>[],
listIntEncoding: <DartLib>[],
mapEntryIntStringEncoding: <DartLib>[],
mapIntStringEncoding: <DartLib>[],
nullEncoding: <DartLib>[],
nullThrownErrorEncoding: <DartLib>[],
numEncoding: <DartLib>[],
outOfMemoryErrorEncoding: <DartLib>[],
provisionalEncoding: <DartLib>[],
rangeErrorEncoding: <DartLib>[],
regExpEncoding: <DartLib>[],
runeIteratorEncoding: <DartLib>[],
runesEncoding: <DartLib>[],
setIntEncoding: <DartLib>[],
stackOverflowErrorEncoding: <DartLib>[],
stateErrorEncoding: <DartLib>[],
stopwatchEncoding: <DartLib>[],
stringBufferEncoding: <DartLib>[],
stringEncoding: <DartLib>[],
symbolEncoding: <DartLib>[],
typeErrorEncoding: <DartLib>[],
uint16ListEncoding: <DartLib>[],
uint32ListEncoding: <DartLib>[],
uint64ListEncoding: <DartLib>[],
uint8ClampedListEncoding: <DartLib>[],
uint8ListEncoding: <DartLib>[],
unimplementedErrorEncoding: <DartLib>[],
unsupportedErrorEncoding: <DartLib>[],
voidEncoding: <DartLib>[]
};
@ -341,8 +464,34 @@ String typeString(DartType type) {
// TODO(ajcbik): inspect type structure semantically, not by display name
// and unify DartFuzz's DartType with analyzer DartType.
switch (type.displayName) {
case 'AbstractClassInstantiationError':
return abstractClassInstantiationErrorEncoding;
case 'ArgumentError':
return argumentErrorEncoding;
case 'AssertionError':
return assertionErrorEncoding;
case 'CastError':
return castErrorEncoding;
case 'ConcurrentModificationError':
return concurrentModificationErrorEncoding;
case 'CyclicInitializationError':
return cyclicInitializationErrorEncoding;
case 'Deprecated':
return deprecatedEncoding;
case 'E':
return intEncoding;
case 'Endian':
return endianEncoding;
case 'Error':
return errorEncoding;
case 'Exception':
return exceptionEncoding;
case 'Expando<double>':
return expandoDoubleEncoding;
case 'Expando<int>':
return expandoIntEncoding;
case 'FallThroughError':
return fallThroughErrorEncoding;
case 'Float32List':
return float32ListEncoding;
case 'Float32x4':
@ -355,6 +504,10 @@ String typeString(DartType type) {
return float64x2Encoding;
case 'Float64x2List':
return float64x2ListEncoding;
case 'FormatException':
return formatExceptionEncoding;
case 'IndexError':
return indexErrorEncoding;
case 'Int16List':
return int16ListEncoding;
case 'Int32List':
@ -367,6 +520,8 @@ String typeString(DartType type) {
return int64ListEncoding;
case 'Int8List':
return int8ListEncoding;
case 'IntegerDivisionByZeroException':
return integerDivisionByZeroExceptionEncoding;
case 'List':
case 'List<E>':
case 'List<Object>':
@ -378,12 +533,45 @@ String typeString(DartType type) {
case 'Map<dynamic, dynamic>':
case 'Map<int, String>':
return mapIntStringEncoding;
case 'MapEntry':
case 'MapEntry<K, V>':
case 'MapEntry<dynamic, dynamic>':
case 'MapEntry<int, String>':
return mapEntryIntStringEncoding;
case 'Null':
return nullEncoding;
case 'NullThrownError':
return nullThrownErrorEncoding;
case 'OutOfMemoryError':
return outOfMemoryErrorEncoding;
case 'Provisional':
return provisionalEncoding;
case 'RangeError':
return rangeErrorEncoding;
case 'RegExp':
return regExpEncoding;
case 'RuneIterator':
return runeIteratorEncoding;
case 'Runes':
return runesEncoding;
case 'Set':
case 'Set<E>':
case 'Set<Object>':
case 'Set<dynamic>':
case 'Set<int>':
return setIntEncoding;
case 'StackOverflowError':
return stackOverflowErrorEncoding;
case 'StateError':
return stateErrorEncoding;
case 'Stopwatch':
return stopwatchEncoding;
case 'StringBuffer':
return stringBufferEncoding;
case 'Symbol':
return symbolEncoding;
case 'TypeError':
return typeErrorEncoding;
case 'Uint16List':
return uint16ListEncoding;
case 'Uint32List':
@ -394,6 +582,10 @@ String typeString(DartType type) {
return uint8ClampedListEncoding;
case 'Uint8List':
return uint8ListEncoding;
case 'UnimplementedError':
return unimplementedErrorEncoding;
case 'UnsupportedError':
return unsupportedErrorEncoding;
case 'num':
return doubleEncoding;
case 'void':

View file

@ -351,7 +351,7 @@ void printTypeMap3(String name, Map<String, Map<String, List<String>>> types,
for (var op in ops.keys.toList()..sort()) {
var paramTypes = ops[op];
stdout.write(" '${op}': [");
for (String paramType in paramTypes.toList()..sort()) {
for (String paramType in paramTypes.toList()) {
stdout.write("${prefix}${paramType}, ");
}
print("], ");
@ -991,9 +991,10 @@ void getOperators(Set<InterfaceType> allTypes) {
bool canConstruct = true;
for (var p in constructor.parameters) {
String tstr = getConstName(p.type.displayName);
// Only allow trivially constructable parameters. If a constructor
// parameter is not constructable from a literal, skip the constructor.
if (!fromLiteral.contains(tstr)) {
if (tstr == "DYNAMIC" || tstr == "OBJECT") {
tstr = "INT";
} else if (!allTypes.contains(p.type)) {
// Exclude constructors that have an unsupported parameter type.
canConstruct = false;
break;
}
@ -1056,21 +1057,23 @@ void analyzeTypes(Set<InterfaceType> allTypes) {
fpTypes.add(typName);
}
} else if (iTyp.typeArguments.length == 2) {
// Analyze Map types.
String argName0 = getConstName(iTyp.typeArguments[0].displayName);
String argName1 = getConstName(iTyp.typeArguments[1].displayName);
subscriptsTo[typName] = argName1;
elementOf[argName1] ??= new Set<String>();
elementOf[argName1].add(typName);
indexableElementOf[argName1] ??= new Set<String>();
indexableElementOf[argName1].add(typName);
indexedBy[typName] = argName0;
indexableTypes.add(typName);
// Check if type is floating point precision.
if (fpTypes.contains(typName) ||
fpTypes.contains(argName0) ||
fpTypes.contains(argName1)) {
fpTypes.add(typName);
if (isIndexable(iTyp)) {
// Analyze Map and MapEntry types.
String argName0 = getConstName(iTyp.typeArguments[0].displayName);
String argName1 = getConstName(iTyp.typeArguments[1].displayName);
subscriptsTo[typName] = argName1;
elementOf[argName1] ??= new Set<String>();
elementOf[argName1].add(typName);
indexableElementOf[argName1] ??= new Set<String>();
indexableElementOf[argName1].add(typName);
indexedBy[typName] = argName0;
indexableTypes.add(typName);
// Check if type is floating point precision.
if (fpTypes.contains(typName) ||
fpTypes.contains(argName0) ||
fpTypes.contains(argName1)) {
fpTypes.add(typName);
}
}
}
}
@ -1085,7 +1088,8 @@ void getParameterizedTypes(
Set<InterfaceType> iTypes) {
// Out: types with no parameters.
for (var tp in allTypes) {
if (tp.typeArguments.length == 1 && tp.typeArguments[0].name == 'E')
if (tp.typeArguments.length == 1 &&
(tp.typeArguments[0].name == 'E' || tp.typeArguments[0].name == 'T'))
pTypes1.add(tp);
else if (tp.typeArguments.length == 2 &&
tp.typeArguments[0].name == 'K' &&
@ -1104,7 +1108,7 @@ Set<InterfaceType> instantiatePTypes(
Set<InterfaceType> pTypes1, // Types with one parameter.
Set<InterfaceType> pTypes2, // Types with two parameters.
Set<InterfaceType> iTypes, // Types with no parameters.
{double maxNew = 64.0}) {
{double maxNew = 10000.0}) {
// Maximum number of newly generated types.
Set<InterfaceType> newITypes = new Set<InterfaceType>();
@ -1165,7 +1169,7 @@ Set<InterfaceType> instantiatePTypes(
Set<InterfaceType> instantiateAllTypes(
Set<InterfaceType> allTypes, Set<String> iTypeFilter, int depth,
{double maxNew = 64.0}) {
{double maxNew = 10000.0}) {
// Types with one parameter (List, Set).
Set<InterfaceType> pTypes1 = new Set<InterfaceType>();
// Types with two parameters (Map).
@ -1196,7 +1200,7 @@ Set<InterfaceType> instantiateAllTypes(
filteredITypes = filteredITypes
.union(instantiatePTypes(pTypes1, pTypes2, filteredITypes, maxNew: mn));
}
// Return list of instantiated types.
return iTypes.union(filteredITypes);
}
@ -1260,18 +1264,39 @@ visitCompilationUnit(CompilationUnitElement unit, Set<InterfaceType> allTypes) {
// to visit typedefs, etc.
for (ClassElement classElement in unit.types) {
if (classElement.isPublic) {
// Hack: Filter out some difficult types.
// Hack: Filter out some difficult types, abstract types and types that
// have methods with abstract type parameters.
// TODO (felih): include filtered types.
if (classElement.name.startsWith('Unmodifiable')) continue;
if (classElement.name.startsWith('Iterable')) continue;
if (classElement.name.startsWith('BigInt')) continue;
if (classElement.name.startsWith('DateTime')) continue;
if (classElement.name.startsWith('Uri')) continue;
// Compute heuristic to decide whether to include the type.
int no = countOperators(classElement);
if (no > operatorCountThreshold) {
allTypes.add(classElement.thisType);
if (classElement.name.startsWith('Unmodifiable') ||
classElement.name.startsWith('Iterable') ||
classElement.name.startsWith('BigInt') ||
classElement.name.startsWith('DateTime') ||
classElement.name.startsWith('Uri') ||
(classElement.name == 'Function') ||
(classElement.name == 'Object') ||
(classElement.name == 'Match') ||
(classElement.name == 'RegExpMatch') ||
(classElement.name == 'pragma') ||
(classElement.name == 'LateInitializationError') ||
(classElement.name == 'ByteBuffer') ||
(classElement.name == 'TypedData') ||
(classElement.name == 'Sink') ||
(classElement.name == 'Pattern') ||
(classElement.name == 'StackTrace') ||
(classElement.name == 'StringSink') ||
(classElement.name == 'Type') ||
(classElement.name == 'Pattern') ||
(classElement.name == 'Invocation') ||
(classElement.name == 'StackTrace') ||
(classElement.name == 'NoSuchMethodError') ||
(classElement.name == 'Comparable') ||
(classElement.name == 'BidirectionalIterator') ||
(classElement.name == 'Iterator')) {
continue;
}
;
allTypes.add(classElement.thisType);
}
}
}
@ -1337,7 +1362,8 @@ main(List<String> arguments) async {
// Extract basic types from dart::core and dart::typed_data.
await getDataTypes(allTypes, results['dart-top']);
// Instantiate parameterized types like List<E>.
allTypes = instantiateAllTypes(allTypes, iTypeFilter, depth, maxNew: 64);
allTypes =
instantiateAllTypes(allTypes, iTypeFilter, depth, maxNew: 10000.0);
// Extract interface Relations between types.
getInterfaceRels(allTypes);
// Extract operators from instantiated types.