Skip to content

Added support for fuzzing #21

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions configs/printers.ini
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[JS-TEST262-JSC]
type: JST262_Printer
type: JST262Printer
name: JS-TEST262-JSC
description: TEST262 format (Accepted by JSC)
add_wait: True
Expand All @@ -12,7 +12,7 @@ string_report: True
waiting_limit: 10000

[JS-TEST262-SM]
type: JST262_Printer
type: JST262Printer
name: JS-TEST262-SM
description: TEST262 format (Accepted by SM)
add_wait: True
Expand All @@ -24,19 +24,19 @@ string_report: True
waiting_limit: 10000

[JS-TEST262-V8]
type: JST262_Printer
type: JST262Printer
name: JS-TEST262-V8
description: TEST262 format (Accepted by V8)
add_wait: True
expected_outputs: True
only_reads_reports: True
or_zero: False
output_assertion: False
output_assertion: True
string_report: True
waiting_limit: 10000

[JS-TEST262-W-V8]
type: JST262_Printer
type: JST262Printer
name: JS-TEST262-W-V8
description: TEST262 format with WASM (Accepted by V8)
add_wait: True
Expand All @@ -49,7 +49,7 @@ waiting_limit: 10000
use_wasm: True

[JS-TEST262-W-JSC]
type: JST262_Printer
type: JST262Printer
name: JS-TEST262-W-JSC
description: TEST262 format with WASM (Accepted by JSC)
add_wait: True
Expand Down
31 changes: 26 additions & 5 deletions ecmasab/execution.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,10 @@ def get_coherent_executions(self):

def get_size(self):
return len(self.executions)

def invalidate_executions(self):
for exe in self.executions:
exe.reads_values = []

class Execution(object):
agent_order = None
Expand Down Expand Up @@ -337,9 +341,9 @@ def apply_param(self, pardic):
for thread in self.threads:
thread.apply_param(pardic)

def expand_events(self):
def expand_events(self, force=False):
for thread in self.threads:
thread.expand_events()
thread.expand_events(force)

def get_params(self):
if not self.params:
Expand Down Expand Up @@ -389,10 +393,14 @@ def has_conditions(self):
self.get_conditions()
return len(self.conditions)

def get_events(self):
def get_events(self, expand_loops=True):
events = []
for thread in self.threads:
events += thread.get_events(True)
events += thread.get_events(expand_loops)
if not expand_loops:
for i in range(len(events)):
if isinstance(events[i], For_Loop):
events = events[:i] + events[i].events + events[i+1:]
return events

def sort_threads(self):
Expand Down Expand Up @@ -460,8 +468,12 @@ def apply_param(self, pardic):
for event in self.events:
event.apply_param(pardic)

def expand_events(self):
def expand_events(self, force=False):
self.uevents = None
if force:
for el in self.events:
if isinstance(el, For_Loop):
el.uevents = None
self.get_events(True)

def get_events(self, expand_loops, conditions=None):
Expand Down Expand Up @@ -898,6 +910,15 @@ def has_info(self, key):
if not self.info:
return False
return key in self.info

def set_values_from_num(self, value):
if self.is_wtear():
value = float(value)
self.set_values_from_float(value, self.address[0], self.address[-1])
else:
value = int(value)
self.set_values_from_int(value, self.address[0], self.address[-1])


def set_values_from_int(self, int_value, begin, end):
self.offset = begin
Expand Down
18 changes: 14 additions & 4 deletions ecmasab/parsing.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ def __init_execution_parser(self):
def __init_program_parser(self):
ivalue = Word(nums)
fvalue = Combine(ivalue + Optional(Literal(T_DOT) + Optional(ivalue)))
nvalue = fvalue | ivalue
nvalue = Optional(T_MIN) + (fvalue | ivalue)
strname = Word(alphas+nums+T_US)

parval = (Combine(Literal(T_LT) + Literal(T_VAL) + Word(alphas+nums+T_US) + Literal(T_GT)))(P_PARAM)
Expand Down Expand Up @@ -243,7 +243,7 @@ def executions_from_string(self, strinput, program=None):

if program:
program.expand_events()
self.__compute_reads_values(executions)
self.compute_reads_values(executions)

return executions

Expand Down Expand Up @@ -311,7 +311,7 @@ def __list_from_relation(self, relation):
events = [x[1] for x in events]
return events

def __compute_reads_values(self, executions):
def compute_reads_values(self, executions):
for exe in executions.executions:
events = exe.get_events()
ev_map = dict((x.name, x) for x in events)
Expand Down Expand Up @@ -354,6 +354,7 @@ def __compute_reads_values(self, executions):
new_read_event = copy.deepcopy(read_event)
new_read_event.set_values(values)
exe.add_read_values(new_read_event)
return executions

def __op_values(self, is_float, ev1, ev2, fun):
val2 = ev2.values
Expand Down Expand Up @@ -542,7 +543,7 @@ def __gen_memory_event(self, command, ctype, parametric, thread, blocks):

if parametric:
me.size = opsize
me.value = list(value)
me.value = self.__flat_expr(value)
me.offset = offset
me.tear = WTEAR if self.__var_type_is_float(command.typeop) else NTEAR
elif me.is_write_or_modify():
Expand All @@ -559,6 +560,15 @@ def __gen_memory_event(self, command, ctype, parametric, thread, blocks):

return me

def __flat_expr(self, expr):
expr = list(expr)
for i in range(len(expr)):
if type(expr[i]) != str:
expr[i] = list(expr[i])
expr = expr[:i] + self.__flat_expr(expr[i]) + expr[i+1:]

return expr

def __populate_program(self, commands):
program = Program()
thread = Thread(MAIN)
Expand Down
11 changes: 7 additions & 4 deletions ecmasab/printers.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@
ASMACCESS += "})`;\n"

def float_approx(value, approx=FLOAT_APPROX):
if value != value:
return value
val = value*(10**approx)
if (value*(10**approx)) % 1 >= float(0.5):
val += 1
Expand Down Expand Up @@ -108,7 +110,7 @@ class PrintersFactory(object):
# Additional printers should be registered here #
@staticmethod
def init_printers():
PrintersFactory.register_printer(JST262_Printer(), True)
PrintersFactory.register_printer(JST262Printer(), True)

PrintersFactory.register_printer(DotPrinter())
PrintersFactory.register_printer(BePrinter())
Expand Down Expand Up @@ -419,7 +421,7 @@ def print_event(self, event, postfix=None):
def get_extension(self):
return self.EXT

class JST262_Printer(EPrinter):
class JST262Printer(EPrinter):
name = "JS-TEST262"
description = "TEST262 format (Standard)"
string_report = True
Expand Down Expand Up @@ -692,7 +694,8 @@ def print_event(self, event, postfix=None):

if event.operation == WRITE:
if is_float and event.address:
event_values = self.print_float(event_values)
if not event.is_parametric():
event_values = self.print_float(event_values)

if self.use_wasm and not is_float:
mop = ("(${asm_memacc}(this, {}, %s%s_sab)).store%s(%s, %s)")%("" if self.string_report else "data.", \
Expand Down Expand Up @@ -953,7 +956,7 @@ class JSONPrinter(EPrinter):
name = "JSON"
description = "\tJSON format"
TYPE = PrinterType.JSON
float_pri_js = "%.2f"
float_pri_js = "%."+str(FLOAT_APPROX)+"f"
EXT = ".json"

def __init__(self):
Expand Down
7 changes: 7 additions & 0 deletions ecmasab/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,10 @@ def auto_convert(strval):
return float(strval)
except Exception:
return strval

def is_number(value):
value = auto_convert(str(value))
return (type(value) == int) or (type(value) == float)

def is_operator(value):
return str(value) in ["+","-","*","/"]
Loading