diff --git a/Sources/FuzzilliCli/Profiles/ArkProfile.swift b/Sources/FuzzilliCli/Profiles/ArkProfile.swift index 85c2b928967fc8afb2d24602d3cfcf54a1b2b798..574af9871d3fdbe62821853d85c3306d201f14e3 100644 --- a/Sources/FuzzilliCli/Profiles/ArkProfile.swift +++ b/Sources/FuzzilliCli/Profiles/ArkProfile.swift @@ -27,7 +27,7 @@ fileprivate let RunNearStackLimitGenerator = CodeGenerator("RunNearStackLimitGen /// ArkTS Generators fileprivate let ArkTSObjectInstanceGenerator = ValueGenerator("ArkTSObjectInstanceGenerator") { b, n in - let builtin = chooseUniform(from: ["Stack", "HashMap", "HashSet", "LinkedList", "List", "ArrayList", "TreeMap", "TreeSet", "LightWeightMap", "LightWeightSet" , "Deque", "Queue"]) + let builtin = chooseUniform(from: ["Stack", "HashMap", "HashSet", "LinkedList", "List", "ArrayList", "TreeMap", "TreeSet", "LightWeightMap", "LightWeightSet" , "Deque", "Queue", "PlainArray"]) let constructor = b.loadBuiltin(builtin) if ["TreeMap", "TreeSet"].contains(builtin) && probability(0.2) { //custom comparator for TreeMap and TreeSet will be generated only in 20% of cases let comparator = b.buildPlainFunction(with: .parameters(n: 2)) { args in @@ -92,6 +92,10 @@ fileprivate let arkTSLightWeightSet = ILType.iterable + ILType.object(ofGroup: " fileprivate let arkTSDeque = ILType.iterable + ILType.object(ofGroup: "Deque", withProperties: ["length"], withMethods: ["insertFront", "insertEnd", "has", "popFirst", "popLast", "forEach", "getFirst", "getLast"]) /// Type of a ArkTS Queue object. fileprivate let arkTSQueue = ILType.iterable + ILType.object(ofGroup: "Queue", withProperties: ["length"], withMethods: ["add", "pop", "getFirst", "forEach"]) +/// Type of a ArkTS PlainArrayType object. +fileprivate let plainArrayType = ILType.iterable + ILType.object(ofGroup: "PlainArray", withProperties: ["length"], withMethods: ["isEmpty", "has", "get", "getIndexOfKey", "getIndexOfValue", "getKeyAt", "getValueAt", "clone", "add", "remove", "removeAt", "removeRangeFrom", "setValueAt", "toString", "clear", "forEach"]) + + /// Tpye of a ArkTS CollectionsMap object fileprivate let collectionsMap = ILType.iterable + ILType.object(ofGroup: "SharedMap", withProperties: ["size"], withMethods: ["entries", "keys", "values", "clear", "delete", "forEach", "get", "has", "set"]) @@ -130,6 +134,8 @@ fileprivate let arkTSLightWeightSetConstructor = ILType.constructor([] => arkTSL fileprivate let arkTSDequeConstructor = ILType.constructor([] => arkTSDeque) /// Type of the ArkTS Queue constructor builtin. fileprivate let arkTSQueueConstructor = ILType.constructor([] => arkTSQueue) +/// Type of the ArkTS PlainArray constructor builtin. +fileprivate let plainArrayConstructor = ILType.constructor([] => plainArrayType) /// Type of the ArkTs CollectionsMap constructor builtin. fileprivate let collectionsMapConstructor = ILType.constructor([.object()] => collectionsMap) @@ -583,6 +589,34 @@ fileprivate let arkTSASONObjects = ObjectGroup( ] ) +/// ObjectGroup modelling ArkTS PlainArray objects +fileprivate let plainArrays = ObjectGroup( + name: "PlainArray", + instanceType: plainArrayType, + properties: [ + "length" : .number, + ], + methods: [ + "isEmpty" : [] => .boolean, + "has" : [.number] => .boolean, + "get" : [.number] => .anything, + "getIndexOfKey" : [.number] => .number, + "getIndexOfValue" : [.anything] => .number, + "getKeyAt" : [.number] => .number, + "getValueAt" : [.number] => .anything, + "clone" : [] => plainArrayType, + "add" : [.number, .anything] => .undefined, + "remove" : [.number] => .anything, + "removeAt" : [.number] => .anything, + "removeRangeFrom" : [.number, .number] => .number, + "setValueAt" : [.number, .anything] => .undefined, + "toString" : [] => .jsString, + "clear" : [] => .undefined, + "forEach" : [.function([.anything, .opt(.number), .opt(plainArrayType)] => .undefined), .opt(.object())] => .undefined, + ] +) + + let arkProfile = Profile( processArgs: { randomize in var args = [ @@ -612,6 +646,7 @@ let arkProfile = Profile( var LightWeightSet = arkPrivate.Load(arkPrivate.LightWeightSet); var Deque = arkPrivate.Load(arkPrivate.Deque); var Queue = arkPrivate.Load(arkPrivate.Queue); + var PlainArray = arkPrivate.Load(arkPrivate.PlainArray); var ASON = { parse : JSON.parseSendable, stringify : JSON.stringify @@ -684,6 +719,7 @@ let arkProfile = Profile( "LightWeightSet" : arkTSLightWeightSetConstructor, "Deque" : arkTSDequeConstructor, "Queue" : arkTSQueueConstructor, + "PlainArray" : plainArrayConstructor, ], additionalObjectGroups: [ @@ -711,6 +747,7 @@ let arkProfile = Profile( arkTSLightWeightSets, arkTSDeques, arkTSQueues, + plainArrays, ], optionalPostProcessor: nil