From 2775d53c6512851c0b193aa41eb6e7e83cb5ec36 Mon Sep 17 00:00:00 2001 From: Richard Dymond Date: Sat, 13 Jul 2024 12:21:12 -0300 Subject: [PATCH] Make trace.py handle invalid TraceLine* configuration parameters --- skoolkit/trace.py | 7 ++++++- tests/test_trace.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/skoolkit/trace.py b/skoolkit/trace.py index 30ab2c44..23ccb147 100644 --- a/skoolkit/trace.py +++ b/skoolkit/trace.py @@ -52,7 +52,6 @@ def run(self, start, stop, max_operations, max_tstates, interrupts, trace_line, else: max_time = 0 if trace_line: - trace_line = get_trace_line(trace_line) r = Registers(registers) if hasattr(simulator, 'trace'): # pragma: no cover @@ -248,6 +247,12 @@ def run(snafile, options, config): trace_operand = config['TraceOperand' + ('', 'Decimal')[options.decimal]] prefix, byte_fmt, word_fmt = (trace_operand + ',' * (2 - trace_operand.count(','))).split(',')[:3] begin = time.time() + if trace_line: + orig_trace_line, trace_line = trace_line, get_trace_line(trace_line) + try: + trace_line.format(pc=0, i='.', r=Registers(simulator.registers), t=0, m=simulator.memory) + except Exception as e: + raise SkoolKitError(f"Invalid format string: '{orig_trace_line}'") tracer.run(start, options.stop, options.max_operations, options.max_tstates, options.interrupts, trace_line, prefix, byte_fmt, word_fmt) rt = time.time() - begin diff --git a/tests/test_trace.py b/tests/test_trace.py index 7e88c12a..0c13a925 100644 --- a/tests/test_trace.py +++ b/tests/test_trace.py @@ -2049,6 +2049,14 @@ def test_config_TraceLine_with_memory_contents(self): """ self.assertEqual(dedent(exp_output).strip(), output.rstrip()) + def test_config_TraceLine_bad_values(self): + self._test_bad_spec('-I TraceLine={q} -vm 1', "Invalid format string: '{q}'") + self._test_bad_spec('-I TraceLine={q -vm 1', "Invalid format string: '{q'") + self._test_bad_spec('-I TraceLine=q} -vm 1', "Invalid format string: 'q}'") + self._test_bad_spec('-I TraceLine={m[65536]} -vm 1', "Invalid format string: '{m[65536]}'") + self._test_bad_spec('-I TraceLine={m[$10000]} -vm 1', "Invalid format string: '{m[$10000]}'") + self._test_bad_spec('-I TraceLine={m[0x10000]} -vm 1', "Invalid format string: '{m[0x10000]}'") + def test_config_TraceLine2_read_from_file(self): ini = """ [trace] @@ -2110,6 +2118,14 @@ def test_config_TraceLine2_with_memory_contents(self): """ self.assertEqual(dedent(exp_output).strip(), output.rstrip()) + def test_config_TraceLine2_bad_values(self): + self._test_bad_spec('-I TraceLine2={q} -vvm 1', "Invalid format string: '{q}'") + self._test_bad_spec('-I TraceLine2={q -vvm 1', "Invalid format string: '{q'") + self._test_bad_spec('-I TraceLine2=q} -vvm 1', "Invalid format string: 'q}'") + self._test_bad_spec('-I TraceLine2={m[65536]} -vvm 1', "Invalid format string: '{m[65536]}'") + self._test_bad_spec('-I TraceLine2={m[$10000]} -vvm 1', "Invalid format string: '{m[$10000]}'") + self._test_bad_spec('-I TraceLine2={m[0x10000]} -vvm 1', "Invalid format string: '{m[0x10000]}'") + def test_config_TraceLineDecimal_read_from_file(self): ini = """ [trace] @@ -2169,6 +2185,14 @@ def test_config_TraceLineDecimal_with_memory_contents(self): """ self.assertEqual(dedent(exp_output).strip(), output.rstrip()) + def test_config_TraceLineDecimal_bad_values(self): + self._test_bad_spec('-I TraceLineDecimal={q} -Dvm 1', "Invalid format string: '{q}'") + self._test_bad_spec('-I TraceLineDecimal={q -Dvm 1', "Invalid format string: '{q'") + self._test_bad_spec('-I TraceLineDecimal=q} -Dvm 1', "Invalid format string: 'q}'") + self._test_bad_spec('-I TraceLineDecimal={m[65536]} -Dvm 1', "Invalid format string: '{m[65536]}'") + self._test_bad_spec('-I TraceLineDecimal={m[$10000]} -Dvm 1', "Invalid format string: '{m[$10000]}'") + self._test_bad_spec('-I TraceLineDecimal={m[0x10000]} -Dvm 1', "Invalid format string: '{m[0x10000]}'") + def test_config_TraceLineDecimal2_read_from_file(self): ini = """ [trace] @@ -2236,6 +2260,14 @@ def test_config_TraceLineDecimal2_with_memory_contents(self): """ self.assertEqual(dedent(exp_output).strip(), output.rstrip()) + def test_config_TraceLineDecimal2_bad_values(self): + self._test_bad_spec('-I TraceLineDecimal2={q} -Dvvm 1', "Invalid format string: '{q}'") + self._test_bad_spec('-I TraceLineDecimal2={q -Dvvm 1', "Invalid format string: '{q'") + self._test_bad_spec('-I TraceLineDecimal2=q} -Dvvm 1', "Invalid format string: 'q}'") + self._test_bad_spec('-I TraceLineDecimal2={m[65536]} -Dvvm 1', "Invalid format string: '{m[65536]}'") + self._test_bad_spec('-I TraceLineDecimal2={m[$10000]} -Dvvm 1', "Invalid format string: '{m[$10000]}'") + self._test_bad_spec('-I TraceLineDecimal2={m[0x10000]} -Dvvm 1', "Invalid format string: '{m[0x10000]}'") + def test_config_TraceOperand_read_from_file(self): ini = """ [trace]