'Get some consecutive unconstrained bytes.
:param name: Name of the unconstrained variable
:param bits: Size of the unconstrained variable
:param source: Where those bytes are read from. Currently it is only used in under-constrained symbolic
execution so that we can track the allocation depth.
:return: The generated variable'

def get_unconstrained_bytes(self, name, bits, source=None):

    if ((self.category == 'mem') and (options.CGC_ZERO_FILL_UNCONSTRAINED_MEMORY in self.state.options)):
        return self.state.se.BVV(0, bits)
    elif (options.SPECIAL_MEMORY_FILL in self.state.options):
        return self.state._special_memory_filler(name, bits)
    else:
        kwargs = {}
        if (options.UNDER_CONSTRAINED_SYMEXEC in self.state.options):
            if ((source is not None) and (type(source) in (int, long))):
                alloc_depth = self.state.uc_manager.get_alloc_depth(source)
                kwargs['uc_alloc_depth'] = (0 if (alloc_depth is None) else (alloc_depth + 1))
        r = self.state.se.Unconstrained(name, bits, **kwargs)
        return r
