Beispiel #1
0
    def __parse_unary_expression__(self, symbol_node: jcmuta.SymbolNode,
                                   code: int):
        """
		:param symbol_node: negative, bit_not, logic_not, address_of, dereference
		:param code:
		:return:
		"""
        operator = symbol_node.get_content().get_token_value()
        operand = symbol_node.get_child(1)
        if operator == "negative":
            u_operand = self.__parse__(operand, code)
            return -self.__cast_to_numb__(u_operand)
        elif operator == "bit_not":
            u_operand = self.__parse__(operand, self.__s_code__)
            return ~self.__cast_to_bits__(u_operand)
        elif operator == "logic_not":
            u_operand = self.__parse__(operand, code)
            return z3.Not(self.__cast_to_bool__(u_operand))
        elif operator == "address_of":
            return z3.Const(self.__unique_name__(symbol_node), z3.IntSort())
        else:
            name = self.__unique_name__(symbol_node)
            name = self.__normal_name__(name, symbol_node.get_data_type())
            return self.__new_reference__(name, symbol_node.get_data_type(),
                                          code)
Beispiel #2
0
 def __parse_list_expression__(self, symbol_node: jcmuta.SymbolNode,
                               code: int):
     elements = list()
     for child in symbol_node.get_children():
         elements.append(self.__parse__(child, code))
     name = self.__unique_name__(symbol_node)
     return self.__new_reference__(name, symbol_node.get_data_type(), code)
Beispiel #3
0
    def __parse_identifier__(self, symbol_node: jcmuta.SymbolNode, code: int):
        """
		:param symbol_node:
		:param code:
		:return:
		"""
        name = symbol_node.get_content().get_token_value()
        data_type = symbol_node.get_data_type()
        name = self.__normal_name__(name, data_type)
        return self.__new_reference__(name, data_type, code)
Beispiel #4
0
 def __parse_call_expression__(self, symbol_node: jcmuta.SymbolNode):
     function = symbol_node.get_child(0)
     if function.get_class_name() == "Identifier":
         func_name = function.get_content().get_token_value()
     else:
         func_name = self.__new_default_name__(function)
     arguments = symbol_node.get_child(1).get_children()
     for k in range(0, len(arguments)):
         arg = self.__parse__(arguments[k])
         self.__save__("{}#{}".format(func_name, k), arg)
     return self.__parse_by_name__(
         "{}_{}".format(func_name, symbol_node.get_class_id()),
         symbol_node.get_data_type())
Beispiel #5
0
    def __parse_call_expression__(self, symbol_node: jcmuta.SymbolNode,
                                  code: int):
        """
		:param symbol_node:
		:param code:
		:return:
		"""
        function = symbol_node.get_child(0)
        if function.get_class_name() == "Identifier":
            func_name = function.get_content().get_token_value()
        else:
            func_name = self.__unique_name__(function)
        arguments = symbol_node.get_child(1).get_children()
        for k in range(0, len(arguments)):
            arg = self.__parse__(arguments[k], 0)
            self.__save_state__("{}#{}".format(func_name, k), arg)
        return self.__new_reference__(func_name, symbol_node.get_data_type(),
                                      code)
Beispiel #6
0
    def __parse_unary_expression__(self, symbol_node: jcmuta.SymbolNode):
        """
		:param symbol_node:
		:return: neg, rsv, not, adr, der
		"""
        operator = symbol_node.get_content().get_token_value()
        u_operand = self.__parse__(symbol_node.get_child(1))
        if operator == "negative":
            return -u_operand
        elif operator == "bit_not":
            if isinstance(u_operand, z3.IntNumRef) or isinstance(
                    u_operand, z3.ArithRef):
                return -u_operand - 1
            else:
                return ~u_operand
        elif operator == "logic_not":
            return z3.Not(self.__cast_to_bool__(u_operand))
        elif operator == "address_of":
            return z3.Const(self.__new_default_name__(symbol_node),
                            z3.IntSort())
        else:
            return self.__parse_by_name__(
                self.__new_default_name__(symbol_node),
                symbol_node.get_data_type())
Beispiel #7
0
 def __parse_field_expression__(self, symbol_node: jcmuta.SymbolNode,
                                code: int):
     name = self.__unique_name__(symbol_node)
     name = self.__normal_name__(name, symbol_node.get_data_type())
     return self.__new_reference__(name, symbol_node.get_data_type(), code)
Beispiel #8
0
 def __parse_list_expression__(self, symbol_node: jcmuta.SymbolNode):
     elements = list()
     for child in symbol_node.get_children():
         elements.append(self.__parse__(child))
     return self.__parse_by_name__(self.__new_default_name__(symbol_node),
                                   symbol_node.get_data_type())
Beispiel #9
0
 def __parse_field_expression__(self, symbol_node: jcmuta.SymbolNode):
     return self.__parse_by_name__(self.__new_default_name__(symbol_node),
                                   symbol_node.get_data_type())
Beispiel #10
0
 def __parse_identifier__(self, symbol_node: jcmuta.SymbolNode):
     return self.__parse_by_name__(
         symbol_node.get_content().get_token_value(),
         symbol_node.get_data_type())