'SSE stands for Static Symbolic Execution, and we also implemented an extended version of Veritesting (Avgerinos,
Thanassis, et al, ICSE 2014).
:param input_state:              The initial state to begin the execution with.
:param boundaries:               Addresses where execution should stop.
:param loop_unrolling_limit:     The maximum times that Veritesting should unroll a loop for.
:param enable_function_inlining: Whether we should enable function inlining and syscall inlining.
:param terminator:               A callback function that takes a state as parameter. Veritesting will terminate
if this function returns True.
:param deviation_filter:         A callback function that takes a state as parameter. Veritesting will put the
state into "deviated" stash if this function returns True.'

def __init__(self, input_state, boundaries=None, loop_unrolling_limit=10, enable_function_inlining=False, terminator=None, deviation_filter=None):

    block = self.project.factory.block(input_state.addr)
    branches = block.vex.constant_jump_targets_and_jumpkinds
    if (not (branches.values() == ['Ijk_Boring', 'Ijk_Boring'])):
        (self.result, self.final_manager) = (False, None)
        return
    self._input_state = input_state.copy()
    self._boundaries = (boundaries if (boundaries is not None) else [])
    self._loop_unrolling_limit = loop_unrolling_limit
    self._enable_function_inlining = enable_function_inlining
    self._terminator = terminator
    self._deviation_filter = deviation_filter
    (self._cfg, self._loop_graph) = self._make_cfg()
    self._loop_backedges = self._cfg._loop_back_edges
    self._loop_heads = set([dst.addr for (_, dst) in self._loop_backedges])
    l.info('Static    symbolic    execution    starts    at    %#x', self._input_state.addr)
    l.debug('The    execution    will    terminate    at    the    following    addresses:    [    %s    ]', ',    '.join([hex(i) for i in self._boundaries]))
    l.debug('A    loop    will    be    unrolled    by    a    maximum    of    %d    times.', self._loop_unrolling_limit)
    if self._enable_function_inlining:
        l.debug('Function    inlining    is    enabled.')
    else:
        l.debug('Function    inlining    is    disabled.')
    (self.result, self.final_manager) = self._veritesting()
