Fix ir encoding in comparison

pull/1757/head
webthethird 2 years ago
parent 2695243b2f
commit 47c92f80f0
  1. 30
      slither/utils/upgradeability.py

@ -221,18 +221,7 @@ def is_function_modified(f1: Function, f2: Function) -> bool:
queue_f1.extend(son for son in node_f1.sons if son not in visited)
queue_f2.extend(son for son in node_f2.sons if son not in visited)
for i, ir in enumerate(node_f1.irs):
ir2 = node_f2.irs[i]
encoded1 = (
encode_var_for_compare(ir)
if isinstance(ir, Variable)
else encode_ir_for_compare(ir)
)
encoded2 = (
encode_var_for_compare(ir2)
if isinstance(ir2, Variable)
else encode_ir_for_compare(ir2)
)
if encoded1 != encoded2:
if encode_ir_for_compare(ir) != encode_ir_for_compare(node_f2.irs[i]):
return True
return False
@ -253,7 +242,12 @@ def ntype(_type: Union[Type, str]) -> str:
elif isinstance(_type, MappingType):
_type = str(_type)
elif isinstance(_type, UserDefinedType):
_type = "user_defined_type" # TODO: this could be Contract, Enum or Struct
if isinstance(_type.type, Contract):
_type = f"contract({_type.type.name})"
elif isinstance(_type.type, Structure):
_type = f"struct({_type.type.name})"
elif isinstance(_type.type, Enum):
_type = f"enum({_type.type.name})"
else:
_type = str(_type)
@ -277,7 +271,7 @@ def ntype(_type: Union[Type, str]) -> str:
def encode_ir_for_compare(ir: Operation) -> str:
# operations
if isinstance(ir, Assignment):
return f"({encode_ir_for_compare(ir.lvalue)}):=({encode_ir_for_compare(ir.rvalue)})"
return f"({encode_var_for_compare(ir.lvalue)}):=({encode_var_for_compare(ir.rvalue)})"
if isinstance(ir, Index):
return f"index({ntype(ir.index_type)})"
if isinstance(ir, Member):
@ -289,7 +283,7 @@ def encode_ir_for_compare(ir: Operation) -> str:
if isinstance(ir, Unary):
return f"unary({str(ir.type)})"
if isinstance(ir, Condition):
return f"condition({encode_ir_for_compare(ir.value)})"
return f"condition({encode_var_for_compare(ir.value)})"
if isinstance(ir, NewStructure):
return "new_structure"
if isinstance(ir, NewContract):
@ -299,7 +293,7 @@ def encode_ir_for_compare(ir: Operation) -> str:
if isinstance(ir, NewElementaryType):
return f"new_elementary({ntype(ir.type)})"
if isinstance(ir, Delete):
return f"delete({encode_ir_for_compare(ir.lvalue)},{encode_ir_for_compare(ir.variable)})"
return f"delete({encode_var_for_compare(ir.lvalue)},{encode_var_for_compare(ir.variable)})"
if isinstance(ir, SolidityCall):
return f"solidity_call({ir.function.full_name})"
if isinstance(ir, InternalCall):
@ -319,9 +313,9 @@ def encode_ir_for_compare(ir: Operation) -> str:
if isinstance(ir, Return): # this can be improved using values
return "return" # .format(ntype(ir.type))
if isinstance(ir, Transfer):
return f"transfer({encode_ir_for_compare(ir.call_value)})"
return f"transfer({encode_var_for_compare(ir.call_value)})"
if isinstance(ir, Send):
return f"send({encode_ir_for_compare(ir.call_value)})"
return f"send({encode_var_for_compare(ir.call_value)})"
if isinstance(ir, Unpack): # TODO: improve
return "unpack"
if isinstance(ir, InitArray): # TODO: improve

Loading…
Cancel
Save