|
|
|
@ -15,39 +15,77 @@ class FormatNamingConvention: |
|
|
|
|
def format(slither, patches, elements): |
|
|
|
|
for element in elements: |
|
|
|
|
if (element['additional_fields']['target'] == "parameter"): |
|
|
|
|
FormatNamingConvention.create_patch(slither, patches, element['additional_fields']['target'], element['name'], element['type_specific_fields']['parent']['name'], element['type_specific_fields']['parent']['type_specific_fields']['parent']['name'], element['source_mapping']['filename_absolute'], element['source_mapping']['filename_relative'], element['source_mapping']['start'],(element['source_mapping']['start']+element['source_mapping']['length'])) |
|
|
|
|
elif (element['additional_fields']['target'] == "modifier" or element['additional_fields']['target'] == "function" or element['additional_fields']['target'] == "event" or element['additional_fields']['target'] == "variable" or element['additional_fields']['target'] == "variable_constant" or element['additional_fields']['target'] == "enum" or element['additional_fields']['target'] == "structure"): |
|
|
|
|
FormatNamingConvention.create_patch(slither, patches, element['additional_fields']['target'], element['name'], element['name'], element['type_specific_fields']['parent']['name'], element['source_mapping']['filename_absolute'], element['source_mapping']['filename_relative'], element['source_mapping']['start'],(element['source_mapping']['start']+element['source_mapping']['length'])) |
|
|
|
|
FormatNamingConvention.create_patch(slither, patches, element['additional_fields']['target'], \ |
|
|
|
|
element['name'], element['type_specific_fields']['parent']['name'], \ |
|
|
|
|
element['type_specific_fields']['parent']['type_specific_fields'] |
|
|
|
|
['parent']['name'], element['source_mapping']['filename_absolute'], \ |
|
|
|
|
element['source_mapping']['filename_relative'], \ |
|
|
|
|
element['source_mapping']['start'],(element['source_mapping']['start'] + |
|
|
|
|
element['source_mapping']['length'])) |
|
|
|
|
elif (element['additional_fields']['target'] == "modifier" or |
|
|
|
|
element['additional_fields']['target'] == "function" or |
|
|
|
|
element['additional_fields']['target'] == "event" or |
|
|
|
|
element['additional_fields']['target'] == "variable" or |
|
|
|
|
element['additional_fields']['target'] == "variable_constant" or |
|
|
|
|
element['additional_fields']['target'] == "enum" or |
|
|
|
|
element['additional_fields']['target'] == "structure"): |
|
|
|
|
FormatNamingConvention.create_patch(slither, patches, element['additional_fields']['target'], \ |
|
|
|
|
element['name'], element['name'], \ |
|
|
|
|
element['type_specific_fields']['parent']['name'], \ |
|
|
|
|
element['source_mapping']['filename_absolute'], \ |
|
|
|
|
element['source_mapping']['filename_relative'], \ |
|
|
|
|
element['source_mapping']['start'],(element['source_mapping']['start'] + |
|
|
|
|
element['source_mapping']['length'])) |
|
|
|
|
else: |
|
|
|
|
FormatNamingConvention.create_patch(slither, patches, element['additional_fields']['target'], element['name'], element['name'], element['name'], element['source_mapping']['filename_absolute'], element['source_mapping']['filename_relative'], element['source_mapping']['start'],(element['source_mapping']['start']+element['source_mapping']['length'])) |
|
|
|
|
FormatNamingConvention.create_patch(slither, patches, element['additional_fields']['target'], \ |
|
|
|
|
element['name'], element['name'], element['name'], \ |
|
|
|
|
element['source_mapping']['filename_absolute'], \ |
|
|
|
|
element['source_mapping']['filename_relative'], \ |
|
|
|
|
element['source_mapping']['start'],(element['source_mapping']['start'] + |
|
|
|
|
element['source_mapping']['length'])) |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def create_patch(slither, patches, _target, name, function_name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end): |
|
|
|
|
def create_patch(slither, patches, _target, name, function_name, contract_name, in_file, in_file_relative, |
|
|
|
|
modify_loc_start, modify_loc_end): |
|
|
|
|
if _target == "contract": |
|
|
|
|
FormatNamingConvention.create_patch_contract_definition(slither, patches, name, in_file, in_file_relative, modify_loc_start, modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_contract_definition(slither, patches, name, in_file, in_file_relative, |
|
|
|
|
modify_loc_start, modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_contract_uses(slither, patches, name, in_file, in_file_relative) |
|
|
|
|
elif _target == "structure": |
|
|
|
|
FormatNamingConvention.create_patch_struct_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_struct_definition(slither, patches, name, contract_name, in_file, |
|
|
|
|
in_file_relative, modify_loc_start, modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_struct_uses(slither, patches, name, contract_name, in_file, in_file_relative) |
|
|
|
|
elif _target == "event": |
|
|
|
|
FormatNamingConvention.create_patch_event_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_event_definition(slither, patches, name, contract_name, in_file, |
|
|
|
|
in_file_relative, modify_loc_start, modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_event_calls(slither, patches, name, contract_name, in_file, in_file_relative) |
|
|
|
|
elif _target == "function": |
|
|
|
|
if name != contract_name: |
|
|
|
|
FormatNamingConvention.create_patch_function_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_function_calls(slither, patches, name, contract_name, in_file, in_file_relative) |
|
|
|
|
FormatNamingConvention.create_patch_function_definition(slither, patches, name, contract_name, in_file, |
|
|
|
|
in_file_relative, modify_loc_start, modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_function_calls(slither, patches, name, contract_name, in_file, |
|
|
|
|
in_file_relative) |
|
|
|
|
elif _target == "parameter": |
|
|
|
|
FormatNamingConvention.create_patch_parameter_declaration(slither, patches, name, function_name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_parameter_uses(slither, patches, name, function_name, contract_name, in_file, in_file_relative) |
|
|
|
|
FormatNamingConvention.create_patch_parameter_declaration(slither, patches, name, function_name, contract_name, |
|
|
|
|
in_file, in_file_relative, modify_loc_start, |
|
|
|
|
modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_parameter_uses(slither, patches, name, function_name, contract_name, |
|
|
|
|
in_file, in_file_relative) |
|
|
|
|
elif _target == "variable_constant" or _target == "variable": |
|
|
|
|
FormatNamingConvention.create_patch_state_variable_declaration(slither, patches, _target, name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_state_variable_uses(slither, patches, _target, name, contract_name, in_file, in_file_relative) |
|
|
|
|
FormatNamingConvention.create_patch_state_variable_declaration(slither, patches, _target, name, contract_name, |
|
|
|
|
in_file, in_file_relative, modify_loc_start, |
|
|
|
|
modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_state_variable_uses(slither, patches, _target, name, contract_name, in_file, |
|
|
|
|
in_file_relative) |
|
|
|
|
elif _target == "enum": |
|
|
|
|
FormatNamingConvention.create_patch_enum_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_enum_definition(slither, patches, name, contract_name, in_file, |
|
|
|
|
in_file_relative, modify_loc_start, modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_enum_uses(slither, patches, name, contract_name, in_file, in_file_relative) |
|
|
|
|
elif _target == "modifier": |
|
|
|
|
FormatNamingConvention.create_patch_modifier_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_modifier_uses(slither, patches, name, contract_name, in_file, in_file_relative) |
|
|
|
|
FormatNamingConvention.create_patch_modifier_definition(slither, patches, name, contract_name, in_file, |
|
|
|
|
in_file_relative, modify_loc_start, modify_loc_end) |
|
|
|
|
FormatNamingConvention.create_patch_modifier_uses(slither, patches, name, contract_name, in_file, |
|
|
|
|
in_file_relative) |
|
|
|
|
else: |
|
|
|
|
logger.error(red("Unknown naming convention! " + _target)) |
|
|
|
|
sys.exit(-1) |
|
|
|
@ -58,7 +96,8 @@ class FormatNamingConvention: |
|
|
|
|
old_str_of_interest = in_file_str[modify_loc_start:modify_loc_end] |
|
|
|
|
m = re.match(r'(.*)'+"contract"+r'(.*)'+name, old_str_of_interest.decode('utf-8')) |
|
|
|
|
old_str_of_interest = in_file_str[modify_loc_start:modify_loc_start+m.span()[1]] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+"contract"+r'(.*)'+name, r'\1'+"contract"+r'\2'+name.capitalize(), old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+"contract"+r'(.*)'+name, r'\1'+"contract"+r'\2'+name.capitalize(), |
|
|
|
|
old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
if num_repl != 0: |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
@ -85,8 +124,10 @@ class FormatNamingConvention: |
|
|
|
|
svs = contract.variables |
|
|
|
|
for sv in svs: |
|
|
|
|
if (str(sv.type) == name): |
|
|
|
|
old_str_of_interest = in_file_str[sv.source_mapping['start']:(sv.source_mapping['start']+sv.source_mapping['length'])] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(name, name.capitalize(),old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
old_str_of_interest = in_file_str[sv.source_mapping['start']:(sv.source_mapping['start'] + |
|
|
|
|
sv.source_mapping['length'])] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(name, name.capitalize(), |
|
|
|
|
old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
|
"detector" : "naming-convention (contract state variable)", |
|
|
|
@ -103,7 +144,9 @@ class FormatNamingConvention: |
|
|
|
|
for fm in fms: |
|
|
|
|
for v in fm.variables: |
|
|
|
|
if (str(v.type) == name): |
|
|
|
|
old_str_of_interest = in_file_str[v.source_mapping['start']:(v.source_mapping['start']+v.source_mapping['length'])].decode('utf-8').split('=')[0] |
|
|
|
|
old_str_of_interest = in_file_str[v.source_mapping['start']:(v.source_mapping['start'] + |
|
|
|
|
v.source_mapping['length'])] |
|
|
|
|
old_str_of_interest = old_str_of_interest.decode('utf-8').split('=')[0] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(name, name.capitalize(),old_str_of_interest, 1) |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
@ -120,10 +163,12 @@ class FormatNamingConvention: |
|
|
|
|
for node in function.nodes: |
|
|
|
|
for ir in node.irs: |
|
|
|
|
if isinstance(ir, NewContract) and ir.contract_name == name: |
|
|
|
|
old_str_of_interest = in_file_str[node.source_mapping['start']:node.source_mapping['start'] + node.source_mapping['length']] |
|
|
|
|
old_str_of_interest = in_file_str[node.source_mapping['start']:node.source_mapping['start'] + |
|
|
|
|
node.source_mapping['length']] |
|
|
|
|
m = re.search("new"+r'(.*)'+name, old_str_of_interest.decode('utf-8')) |
|
|
|
|
old_str_of_interest = old_str_of_interest.decode('utf-8')[m.span()[0]:] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn("new"+r'(.*)'+name, "new"+r'\1'+name[0].upper()+name[1:], old_str_of_interest, 1) |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn("new"+r'(.*)'+name, "new"+r'\1'+name[0].upper() + |
|
|
|
|
name[1:], old_str_of_interest, 1) |
|
|
|
|
if num_repl != 0: |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
@ -140,7 +185,8 @@ class FormatNamingConvention: |
|
|
|
|
sys.exit(-1) |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def create_patch_modifier_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end): |
|
|
|
|
def create_patch_modifier_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, |
|
|
|
|
modify_loc_end): |
|
|
|
|
target_contract = slither.get_contract_from_name(contract_name) |
|
|
|
|
if not target_contract: |
|
|
|
|
logger.error(red("Contract not found?!")) |
|
|
|
@ -151,7 +197,8 @@ class FormatNamingConvention: |
|
|
|
|
old_str_of_interest = in_file_str[modify_loc_start:modify_loc_end] |
|
|
|
|
m = re.match(r'(.*)'+"modifier"+r'(.*)'+name, old_str_of_interest.decode('utf-8')) |
|
|
|
|
old_str_of_interest = in_file_str[modify_loc_start:modify_loc_start+m.span()[1]] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+"modifier"+r'(.*)'+name, r'\1'+"modifier"+r'\2'+name[0].lower()+name[1:], old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+"modifier"+r'(.*)'+name, r'\1'+"modifier"+r'\2' + |
|
|
|
|
name[0].lower()+name[1:], old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
if num_repl != 0: |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
@ -178,8 +225,10 @@ class FormatNamingConvention: |
|
|
|
|
for m in function.modifiers: |
|
|
|
|
if (m.name == name): |
|
|
|
|
in_file_str = slither.source_code[in_file].encode('utf-8') |
|
|
|
|
old_str_of_interest = in_file_str[int(function.parameters_src.source_mapping['start']):int(function.returns_src.source_mapping['start'])] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(name, name[0].lower()+name[1:],old_str_of_interest.decode('utf-8'),1) |
|
|
|
|
old_str_of_interest = in_file_str[int(function.parameters_src.source_mapping['start']): |
|
|
|
|
int(function.returns_src.source_mapping['start'])] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(name, name[0].lower()+name[1:], |
|
|
|
|
old_str_of_interest.decode('utf-8'),1) |
|
|
|
|
if num_repl != 0: |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
@ -196,7 +245,8 @@ class FormatNamingConvention: |
|
|
|
|
sys.exit(-1) |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def create_patch_function_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end): |
|
|
|
|
def create_patch_function_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, |
|
|
|
|
modify_loc_end): |
|
|
|
|
target_contract = slither.get_contract_from_name(contract_name) |
|
|
|
|
if not target_contract: |
|
|
|
|
logger.error(red("Contract not found?!")) |
|
|
|
@ -207,7 +257,8 @@ class FormatNamingConvention: |
|
|
|
|
old_str_of_interest = in_file_str[modify_loc_start:modify_loc_end] |
|
|
|
|
m = re.match(r'(.*)'+"function"+r'\s*'+name, old_str_of_interest.decode('utf-8')) |
|
|
|
|
old_str_of_interest = in_file_str[modify_loc_start:modify_loc_start+m.span()[1]] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+"function"+r'(.*)'+name, r'\1'+"function"+r'\2'+name[0].lower()+name[1:], old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+"function"+r'(.*)'+name, r'\1'+"function"+r'\2'+ |
|
|
|
|
name[0].lower()+name[1:], old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
if num_repl != 0: |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
@ -234,15 +285,19 @@ class FormatNamingConvention: |
|
|
|
|
called_function = str(external_call.called).split('.')[-1] |
|
|
|
|
if called_function == high_level_call[1].name: |
|
|
|
|
in_file_str = slither.source_code[in_file].encode('utf-8') |
|
|
|
|
old_str_of_interest = in_file_str[int(external_call.source_mapping['start']):int(external_call.source_mapping['start'])+int(external_call.source_mapping['length'])] |
|
|
|
|
old_str_of_interest = in_file_str[int(external_call.source_mapping['start']): |
|
|
|
|
int(external_call.source_mapping['start']) + |
|
|
|
|
int(external_call.source_mapping['length'])] |
|
|
|
|
called_function_name = old_str_of_interest.decode('utf-8').split('.')[-1] |
|
|
|
|
fixed_function_name = called_function_name[0].lower() + called_function_name[1:] |
|
|
|
|
new_string = '.'.join(old_str_of_interest.decode('utf-8').split('.')[:-1]) + '.' + fixed_function_name |
|
|
|
|
new_string = '.'.join(old_str_of_interest.decode('utf-8').split('.')[:-1]) + '.' + \ |
|
|
|
|
fixed_function_name |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
|
"detector" : "naming-convention (function calls)", |
|
|
|
|
"start" : external_call.source_mapping['start'], |
|
|
|
|
"end" : int(external_call.source_mapping['start']) + int(external_call.source_mapping['length']), |
|
|
|
|
"end" : int(external_call.source_mapping['start']) + |
|
|
|
|
int(external_call.source_mapping['length']), |
|
|
|
|
"old_string" : old_str_of_interest.decode('utf-8'), |
|
|
|
|
"new_string" : new_string |
|
|
|
|
} |
|
|
|
@ -251,12 +306,20 @@ class FormatNamingConvention: |
|
|
|
|
for internal_call in node.internal_calls_as_expressions: |
|
|
|
|
if (str(internal_call.called) == name): |
|
|
|
|
in_file_str = slither.source_code[in_file].encode('utf-8') |
|
|
|
|
old_str_of_interest = in_file_str[int(internal_call.source_mapping['start']):int(internal_call.source_mapping['start'])+int(internal_call.source_mapping['length'])].decode('utf-8').split('(')[0] |
|
|
|
|
old_str_of_interest = in_file_str[int(internal_call.source_mapping['start']): |
|
|
|
|
int(internal_call.source_mapping['start']) + |
|
|
|
|
int(internal_call.source_mapping['length'])] |
|
|
|
|
old_str_of_interest = old_str_of_interest.decode('utf-8').split('(')[0] |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
|
"detector" : "naming-convention (function calls)", |
|
|
|
|
"start" : internal_call.source_mapping['start'], |
|
|
|
|
"end" : int(internal_call.source_mapping['start']) + int(internal_call.source_mapping['length']) - len('('.join(in_file_str[int(internal_call.source_mapping['start']):int(internal_call.source_mapping['start'])+int(internal_call.source_mapping['length'])].decode('utf-8').split('(')[1:])) - 1, |
|
|
|
|
"end" : int(internal_call.source_mapping['start']) + |
|
|
|
|
int(internal_call.source_mapping['length']) - |
|
|
|
|
len('('.join(in_file_str[int(internal_call.source_mapping['start']): |
|
|
|
|
int(internal_call.source_mapping['start']) + |
|
|
|
|
int(internal_call.source_mapping['length'])] \ |
|
|
|
|
.decode('utf-8').split('(')[1:])) - 1, |
|
|
|
|
"old_string" : old_str_of_interest, |
|
|
|
|
"new_string" : old_str_of_interest[0].lower()+old_str_of_interest[1:] |
|
|
|
|
} |
|
|
|
@ -264,7 +327,8 @@ class FormatNamingConvention: |
|
|
|
|
patches[in_file_relative].append(patch) |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def create_patch_event_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end): |
|
|
|
|
def create_patch_event_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, |
|
|
|
|
modify_loc_end): |
|
|
|
|
target_contract = slither.get_contract_from_name(contract_name) |
|
|
|
|
if not target_contract: |
|
|
|
|
logger.error(red("Contract not found?!")) |
|
|
|
@ -274,7 +338,9 @@ class FormatNamingConvention: |
|
|
|
|
event_name = name.split('(')[0] |
|
|
|
|
in_file_str = slither.source_code[in_file].encode('utf-8') |
|
|
|
|
old_str_of_interest = in_file_str[modify_loc_start:modify_loc_end] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+"event"+r'(.*)'+event_name, r'\1'+"event"+r'\2'+event_name[0].capitalize()+event_name[1:], old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+"event"+r'(.*)'+event_name, r'\1'+"event"+r'\2' + |
|
|
|
|
event_name[0].capitalize()+event_name[1:], |
|
|
|
|
old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
if num_repl != 0: |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
@ -303,20 +369,24 @@ class FormatNamingConvention: |
|
|
|
|
for call in node.internal_calls_as_expressions: |
|
|
|
|
if (str(call.called) == event_name): |
|
|
|
|
in_file_str = slither.source_code[in_file].encode('utf-8') |
|
|
|
|
old_str_of_interest = in_file_str[int(call.source_mapping['start']):int(call.source_mapping['start'])+int(call.source_mapping['length'])] |
|
|
|
|
old_str_of_interest = in_file_str[int(call.source_mapping['start']): |
|
|
|
|
int(call.source_mapping['start']) + |
|
|
|
|
int(call.source_mapping['length'])] |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
|
"detector" : "naming-convention (event calls)", |
|
|
|
|
"start" : call.source_mapping['start'], |
|
|
|
|
"end" : int(call.source_mapping['start']) + int(call.source_mapping['length']), |
|
|
|
|
"old_string" : old_str_of_interest.decode('utf-8'), |
|
|
|
|
"new_string" : old_str_of_interest.decode('utf-8')[0].capitalize()+old_str_of_interest.decode('utf-8')[1:] |
|
|
|
|
"new_string" : old_str_of_interest.decode('utf-8')[0].capitalize() + |
|
|
|
|
old_str_of_interest.decode('utf-8')[1:] |
|
|
|
|
} |
|
|
|
|
if not patch in patches[in_file_relative]: |
|
|
|
|
patches[in_file_relative].append(patch) |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def create_patch_parameter_declaration(slither, patches, name, function_name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end): |
|
|
|
|
def create_patch_parameter_declaration(slither, patches, name, function_name, contract_name, in_file, in_file_relative, |
|
|
|
|
modify_loc_start, modify_loc_end): |
|
|
|
|
target_contract = slither.get_contract_from_name(contract_name) |
|
|
|
|
if not target_contract: |
|
|
|
|
logger.error(red("Contract not found?!")) |
|
|
|
@ -326,9 +396,11 @@ class FormatNamingConvention: |
|
|
|
|
in_file_str = slither.source_code[in_file].encode('utf-8') |
|
|
|
|
old_str_of_interest = in_file_str[modify_loc_start:modify_loc_end] |
|
|
|
|
if(name[0] == '_'): |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+name+r'(.*)', r'\1'+name[0]+name[1].upper()+name[2:]+r'\2', old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+name+r'(.*)', r'\1'+name[0]+name[1].upper() + |
|
|
|
|
name[2:]+r'\2', old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
else: |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+name+r'(.*)', r'\1'+'_'+name[0].upper()+name[1:]+r'\2', old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+name+r'(.*)', r'\1'+'_'+name[0].upper() + |
|
|
|
|
name[1:]+r'\2', old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
if num_repl != 0: |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
@ -354,14 +426,22 @@ class FormatNamingConvention: |
|
|
|
|
for node in function.nodes: |
|
|
|
|
vars = node._expression_vars_written + node._expression_vars_read |
|
|
|
|
for v in vars: |
|
|
|
|
if isinstance(v, Identifier) and str(v) == name and [str(lv) for lv in (node._local_vars_read+node._local_vars_written) if str(lv) == name]: |
|
|
|
|
if isinstance(v, Identifier) and str(v) == name and [str(lv) for lv in |
|
|
|
|
(node._local_vars_read + |
|
|
|
|
node._local_vars_written) |
|
|
|
|
if str(lv) == name]: |
|
|
|
|
modify_loc_start = int(v.source_mapping['start']) |
|
|
|
|
modify_loc_end = int(v.source_mapping['start']) + int(v.source_mapping['length']) |
|
|
|
|
old_str_of_interest = in_file_str[modify_loc_start:modify_loc_end] |
|
|
|
|
if(name[0] == '_'): |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+name+r'(.*)', r'\1'+name[0]+name[1].upper()+name[2:]+r'\2', old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+name+r'(.*)', |
|
|
|
|
r'\1'+name[0]+name[1].upper()+name[2:] + |
|
|
|
|
r'\2', old_str_of_interest.decode('utf-8'), |
|
|
|
|
1) |
|
|
|
|
else: |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+name+r'(.*)', r'\1'+'_'+name[0].upper()+name[1:]+r'\2', old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+name+r'(.*)', r'\1'+'_' + |
|
|
|
|
name[0].upper()+name[1:]+r'\2', |
|
|
|
|
old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
if num_repl != 0: |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
@ -381,17 +461,25 @@ class FormatNamingConvention: |
|
|
|
|
for modifier in function._expression_modifiers: |
|
|
|
|
for arg in modifier.arguments: |
|
|
|
|
if str(arg) == name: |
|
|
|
|
old_str_of_interest = in_file_str[modifier.source_mapping['start']:modifier.source_mapping['start']+modifier.source_mapping['length']] |
|
|
|
|
old_str_of_interest_beyond_modifier_name = old_str_of_interest.decode('utf-8').split('(')[1] |
|
|
|
|
old_str_of_interest = in_file_str[modifier.source_mapping['start']: |
|
|
|
|
modifier.source_mapping['start'] + |
|
|
|
|
modifier.source_mapping['length']] |
|
|
|
|
old_str_of_interest_beyond_modifier_name = old_str_of_interest.decode('utf-8')\ |
|
|
|
|
.split('(')[1] |
|
|
|
|
if(name[0] == '_'): |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+name+r'(.*)', r'\1'+name[0]+name[1].upper()+name[2:]+r'\2', old_str_of_interest_beyond_modifier_name, 1) |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+name+r'(.*)', r'\1'+name[0]+ |
|
|
|
|
name[1].upper()+name[2:]+r'\2', |
|
|
|
|
old_str_of_interest_beyond_modifier_name, 1) |
|
|
|
|
else: |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+name+r'(.*)', r'\1'+'_'+name[0].upper()+name[1:]+r'\2', old_str_of_interest_beyond_modifier_name, 1) |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+name+r'(.*)', r'\1'+'_'+ |
|
|
|
|
name[0].upper()+name[1:]+r'\2', |
|
|
|
|
old_str_of_interest_beyond_modifier_name, 1) |
|
|
|
|
if num_repl != 0: |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
|
"detector" : "naming-convention (parameter uses)", |
|
|
|
|
"start" : modifier.source_mapping['start'] + len(old_str_of_interest.decode('utf-8').split('(')[0]) + 1, |
|
|
|
|
"start" : modifier.source_mapping['start'] + |
|
|
|
|
len(old_str_of_interest.decode('utf-8').split('(')[0]) + 1, |
|
|
|
|
"end" : modifier.source_mapping['start'] + modifier.source_mapping['length'], |
|
|
|
|
"old_string" : old_str_of_interest_beyond_modifier_name, |
|
|
|
|
"new_string" : new_str_of_interest |
|
|
|
@ -403,7 +491,8 @@ class FormatNamingConvention: |
|
|
|
|
sys.exit(-1) |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def create_patch_state_variable_declaration(slither, patches, _target, name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end): |
|
|
|
|
def create_patch_state_variable_declaration(slither, patches, _target, name, contract_name, in_file, in_file_relative, |
|
|
|
|
modify_loc_start, modify_loc_end): |
|
|
|
|
for contract in slither.contracts: |
|
|
|
|
if (contract.name == contract_name): |
|
|
|
|
for var in contract.state_variables: |
|
|
|
@ -440,7 +529,10 @@ class FormatNamingConvention: |
|
|
|
|
for node in fm.nodes: |
|
|
|
|
vars = node._expression_vars_written + node._expression_vars_read |
|
|
|
|
for v in vars: |
|
|
|
|
if isinstance(v, Identifier) and str(v) == name and [str(sv) for sv in (node._state_vars_read+node._state_vars_written) if str(sv) == name]: |
|
|
|
|
if isinstance(v, Identifier) and str(v) == name and [str(sv) for sv in |
|
|
|
|
(node._state_vars_read + |
|
|
|
|
node._state_vars_written) |
|
|
|
|
if str(sv) == name]: |
|
|
|
|
modify_loc_start = int(v.source_mapping['start']) |
|
|
|
|
modify_loc_end = int(v.source_mapping['start']) + int(v.source_mapping['length']) |
|
|
|
|
in_file_str = slither.source_code[in_file].encode('utf-8') |
|
|
|
@ -462,14 +554,17 @@ class FormatNamingConvention: |
|
|
|
|
patches[in_file_relative].append(patch) |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def create_patch_enum_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end): |
|
|
|
|
def create_patch_enum_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, |
|
|
|
|
modify_loc_end): |
|
|
|
|
for contract in slither.contracts: |
|
|
|
|
if (contract.name == contract_name): |
|
|
|
|
for enum in contract.enums: |
|
|
|
|
if (enum.name == name): |
|
|
|
|
in_file_str = slither.source_code[in_file].encode('utf-8') |
|
|
|
|
old_str_of_interest = in_file_str[modify_loc_start:modify_loc_end] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+"enum"+r'(.*)'+name, r'\1'+"enum"+r'\2'+name[0].capitalize()+name[1:], old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+"enum"+r'(.*)'+name, r'\1'+"enum"+r'\2'+ |
|
|
|
|
name[0].capitalize()+name[1:], |
|
|
|
|
old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
if num_repl != 0: |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
@ -498,8 +593,10 @@ class FormatNamingConvention: |
|
|
|
|
svs = contract.variables |
|
|
|
|
for sv in svs: |
|
|
|
|
if (str(sv.type) == contract_name + "." + name): |
|
|
|
|
old_str_of_interest = in_file_str[sv.source_mapping['start']:(sv.source_mapping['start']+sv.source_mapping['length'])] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(name, name.capitalize(),old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
old_str_of_interest = in_file_str[sv.source_mapping['start']:(sv.source_mapping['start']+ |
|
|
|
|
sv.source_mapping['length'])] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(name, name.capitalize(), |
|
|
|
|
old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
|
"detector" : "naming-convention (enum use)", |
|
|
|
@ -517,8 +614,10 @@ class FormatNamingConvention: |
|
|
|
|
# Enum declarations |
|
|
|
|
for v in fm.variables: |
|
|
|
|
if (str(v.type) == contract_name + "." + name): |
|
|
|
|
old_str_of_interest = in_file_str[v.source_mapping['start']:(v.source_mapping['start']+v.source_mapping['length'])] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(name, name.capitalize(),old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
old_str_of_interest = in_file_str[v.source_mapping['start']:(v.source_mapping['start']+ |
|
|
|
|
v.source_mapping['length'])] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(name, name.capitalize(), |
|
|
|
|
old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
|
"detector" : "naming-convention (enum use)", |
|
|
|
@ -535,17 +634,27 @@ class FormatNamingConvention: |
|
|
|
|
for ir in node.irs: |
|
|
|
|
if isinstance(ir, Member): |
|
|
|
|
if str(ir.variable_left) == name: |
|
|
|
|
old_str_of_interest = in_file_str[node.source_mapping['start']:(node.source_mapping['start']+node.source_mapping['length'])].decode('utf-8').split('=')[1] |
|
|
|
|
old_str_of_interest = in_file_str[node.source_mapping['start']: |
|
|
|
|
(node.source_mapping['start']+ |
|
|
|
|
node.source_mapping['length'])].decode('utf-8')\ |
|
|
|
|
.split('=')[1] |
|
|
|
|
m = re.search(r'(.*)'+name, old_str_of_interest) |
|
|
|
|
old_str_of_interest = old_str_of_interest[m.span()[0]:] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+name, r'\1'+name[0].upper()+name[1:], old_str_of_interest, 1) |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+name, r'\1'+name[0].upper()+name[1:], |
|
|
|
|
old_str_of_interest, 1) |
|
|
|
|
if num_repl != 0: |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
|
"detector" : "naming-convention (enum use)", |
|
|
|
|
"start" : node.source_mapping['start'] + len(in_file_str[node.source_mapping['start']:(node.source_mapping['start']+node.source_mapping['length'])].decode('utf-8').split('=')[0]) + 1 + m.span()[0], |
|
|
|
|
"end" : node.source_mapping['start'] + len(in_file_str[node.source_mapping['star\ |
|
|
|
|
t']:(node.source_mapping['start']+node.source_mapping['length'])].decode('utf-8').split('=')[0]) + 1 + m.span()[0] + len(old_str_of_interest), |
|
|
|
|
"start" : node.source_mapping['start'] + |
|
|
|
|
len(in_file_str[node.source_mapping['start']: |
|
|
|
|
(node.source_mapping['start']+ |
|
|
|
|
node.source_mapping['length'])].decode('utf-8').split('=')[0]) + |
|
|
|
|
1 + m.span()[0], |
|
|
|
|
"end" : node.source_mapping['start'] + |
|
|
|
|
len(in_file_str[node.source_mapping['start']:(node.source_mapping['start']+ |
|
|
|
|
node.source_mapping['length'])].\ |
|
|
|
|
decode('utf-8').split('=')[0]) + 1 + m.span()[0] + len(old_str_of_interest), |
|
|
|
|
"old_string" : old_str_of_interest, |
|
|
|
|
"new_string" : new_str_of_interest |
|
|
|
|
} |
|
|
|
@ -557,14 +666,17 @@ t']:(node.source_mapping['start']+node.source_mapping['length'])].decode('utf-8' |
|
|
|
|
# To-do: Check any other place/way where enum type is used |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def create_patch_struct_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, modify_loc_end): |
|
|
|
|
def create_patch_struct_definition(slither, patches, name, contract_name, in_file, in_file_relative, modify_loc_start, |
|
|
|
|
modify_loc_end): |
|
|
|
|
for contract in slither.contracts: |
|
|
|
|
if (contract.name == contract_name): |
|
|
|
|
for struct in contract.structures: |
|
|
|
|
if (struct.name == name): |
|
|
|
|
in_file_str = slither.source_code[in_file].encode('utf-8') |
|
|
|
|
old_str_of_interest = in_file_str[modify_loc_start:modify_loc_end] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+"struct"+r'(.*)'+name, r'\1'+"struct"+r'\2'+name[0].capitalize()+name[1:], old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(r'(.*)'+"struct"+r'(.*)'+name, r'\1'+"struct"+r'\2'+ |
|
|
|
|
name[0].capitalize()+name[1:], |
|
|
|
|
old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
if num_repl != 0: |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
@ -593,8 +705,10 @@ t']:(node.source_mapping['start']+node.source_mapping['length'])].decode('utf-8' |
|
|
|
|
svs = contract.variables |
|
|
|
|
for sv in svs: |
|
|
|
|
if (str(sv.type) == contract_name + "." + name): |
|
|
|
|
old_str_of_interest = in_file_str[sv.source_mapping['start']:(sv.source_mapping['start']+sv.source_mapping['length'])] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(name, name.capitalize(),old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
old_str_of_interest = in_file_str[sv.source_mapping['start']:(sv.source_mapping['start']+ |
|
|
|
|
sv.source_mapping['length'])] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(name, name.capitalize(), |
|
|
|
|
old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
|
"detector" : "naming-convention (struct use)", |
|
|
|
@ -611,8 +725,10 @@ t']:(node.source_mapping['start']+node.source_mapping['length'])].decode('utf-8' |
|
|
|
|
for fm in fms: |
|
|
|
|
for v in fm.variables: |
|
|
|
|
if (str(v.type) == contract_name + "." + name): |
|
|
|
|
old_str_of_interest = in_file_str[v.source_mapping['start']:(v.source_mapping['start']+v.source_mapping['length'])] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(name, name.capitalize(),old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
old_str_of_interest = in_file_str[v.source_mapping['start']:(v.source_mapping['start']+ |
|
|
|
|
v.source_mapping['length'])] |
|
|
|
|
(new_str_of_interest, num_repl) = re.subn(name, name.capitalize(), |
|
|
|
|
old_str_of_interest.decode('utf-8'), 1) |
|
|
|
|
patch = { |
|
|
|
|
"file" : in_file, |
|
|
|
|
"detector" : "naming-convention (struct use)", |
|
|
|
|