diff options
| author | Theofilos Augoustis <theofilos.augoustis@gmail.com> | 2024-02-07 15:06:56 +0100 |
|---|---|---|
| committer | Theofilos Augoustis <theofilos.augoustis@gmail.com> | 2024-02-07 15:06:56 +0100 |
| commit | c6503a3ddcce2fdefc5c93c6901f26c761ae859b (patch) | |
| tree | 542319cb1998c5cf412538e47c380366b02cd6ff /focaccia.py | |
| parent | 6471febedbdf5d0b4d14d75eafcf75ae48022c61 (diff) | |
| download | focaccia-c6503a3ddcce2fdefc5c93c6901f26c761ae859b.tar.gz focaccia-c6503a3ddcce2fdefc5c93c6901f26c761ae859b.zip | |
Extract matching algorithms into a module
We have: - Trace folding: Resolve mismatches in snapshot granularity - Trace matching: Resolve mismatches in program flow
Diffstat (limited to 'focaccia.py')
| -rwxr-xr-x | focaccia.py | 42 |
1 files changed, 3 insertions, 39 deletions
diff --git a/focaccia.py b/focaccia.py index 032615b..bf5a9ff 100755 --- a/focaccia.py +++ b/focaccia.py @@ -7,9 +7,10 @@ from typing import Iterable from focaccia.arch import supported_architectures from focaccia.compare import compare_simple, compare_symbolic, ErrorTypes from focaccia.lldb_target import LLDBConcreteTarget +from focaccia.match import fold_traces from focaccia.parser import parse_arancini from focaccia.snapshot import ProgramState -from focaccia.symbolic import SymbolicTransform, collect_symbolic_trace +from focaccia.symbolic import collect_symbolic_trace from focaccia.utils import print_result verbosity = { @@ -42,43 +43,6 @@ def collect_concrete_trace(oracle_program: str, breakpoints: Iterable[int]) \ return snapshots -def match_traces(test: list[ProgramState], truth: list[SymbolicTransform]): - if not test or not truth: - return [], [] - - assert(test[0].read_register('pc') == truth[0].addr) - - def index(seq, target, access=lambda el: el): - for i, el in enumerate(seq): - if access(el) == target: - return i - return None - - i = 0 - for next_state in test[1:]: - next_pc = next_state.read_register('pc') - index_in_truth = index(truth[i:], next_pc, lambda el: el.range[1]) - - # If no next element (i.e. no foldable range) is found in the truth - # trace, assume that the test trace contains excess states. Remove one - # and try again. This might skip testing some states, but covers more - # of the entire trace. - if index_in_truth is None: - test.pop(i + 1) - continue - - # Fold the range of truth states until the next test state - for _ in range(index_in_truth): - truth[i].concat(truth.pop(i + 1)) - - assert(truth[i].range[1] == truth[i + 1].addr) - - i += 1 - if len(truth) <= i: - break - - return test, truth - def parse_arguments(): parser = argparse.ArgumentParser(description='Comparator for emulator logs to reference') parser.add_argument('-p', '--program', @@ -139,7 +103,7 @@ def main(): if args.symbolic: print(f'Tracing {oracle} symbolically with arguments {oracle_args}...') transforms = collect_symbolic_trace(oracle, oracle_args) - test_states, transforms = match_traces(test_states, transforms) + fold_traces(test_states, transforms) result = compare_symbolic(test_states, transforms) else: # Record truth states from a concrete execution of the oracle |