def get_default_value_by_type(type_, state=None): """ Java specify defaults values for primitive and reference types. This method returns the default value for a given type. :param str type_: Name of type. :return: Default value for this type. """ if type_ in ['byte', 'char', 'short', 'int', 'boolean']: return BVS('default_value_{}'.format(type_), 32) elif type_ == "long": return BVS('default_value_{}'.format(type_), 64) elif type_ == 'float': return FPS('default_value_{}'.format(type_), FSORT_FLOAT) elif type_ == 'double': return FPS('default_value_{}'.format(type_), FSORT_DOUBLE) elif state is not None: if type_ == 'java.lang.String': return SimSootValue_StringRef.new_string(state, StringS('default_value_{}'.format(type_), 1000)) if type_.endswith('[][]'): raise NotImplementedError # multiarray = SimSootExpr_NewMultiArray.new_array(self.state, element_type, size) # multiarray.add_default_value_generator(lambda s: SimSootExpr_NewMultiArray._generate_inner_array(s, element_type, sizes)) # return multiarray elif type_.endswith('[]'): array = SimSootExpr_NewArray.new_array(state, type_[:-2], BVV(2, 32)) return array else: return SimSootValue_ThisRef.new_object(state, type_, symbolic=True, init_object=False) else: # not a primitive type # => treat it as a reference return SootNullConstant()
def _get_default_symbolic_value_by_type(type_, state): if type_ in ['byte', 'char', 'short', 'int', 'boolean']: return BVS('default_value_{}'.format(type_), 32) if type_ == "long": return BVS('default_value_{}'.format(type_), 64) if type_ == 'float': return FPS('default_value_{}'.format(type_), FSORT_FLOAT) if type_ == 'double': return FPS('default_value_{}'.format(type_), FSORT_DOUBLE) if type_ == 'java.lang.String': return SimSootValue_StringRef.new_string( state, StringS('default_value_{}'.format(type_), 1000)) if type_.endswith('[][]'): raise NotImplementedError # multiarray = SimSootExpr_NewMultiArray.new_array(self.state, element_type, size) # multiarray.add_default_value_generator(lambda s: SimSootExpr_NewMultiArray._generate_inner_array(s, element_type, sizes)) # return multiarray if type_.endswith('[]'): array = SimSootExpr_NewArray.new_array(state, type_[:-2], BVV(2, 32)) return array return SimSootValue_ThisRef.new_object(state, type_, symbolic=True, init_object=False)
def run(self, this): # pylint: disable=arguments-differ,unused-argument str_ref = SimSootValue_StringRef(self.state.memory.get_new_uuid()) self.state.memory.store(str_ref, StringS("scanner_return", 100)) # save reference in global dict, so we can easily access it later try: self.state.globals['java.util.Scanner'].append(str_ref) except KeyError: self.state.globals['java.util.Scanner'] = [str_ref] return str_ref
def generate_symbolic_cmd_line_arg(state, max_length=1000): """ Generates a new symbolic cmd line argument string. :return: The string reference. """ str_ref = SimSootValue_StringRef(state.memory.get_new_uuid()) str_sym = StringS("cmd_line_arg", max_length) state.solver.add(str_sym != StringV("")) state.memory.store(str_ref, str_sym) return str_ref