Skip to content

Commit f0a0b02

Browse files
committed
First attempt to get rid of numeric addressing, should fail CI due to no changes to test_raw.py
1 parent aadecfe commit f0a0b02

3 files changed

Lines changed: 50 additions & 53 deletions

File tree

‎leep/cli.py‎

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -43,27 +43,16 @@ def parseTransaction(xact):
4343
Example Implied Transaction
4444
-------------------------------------------
4545
regname Read from named register (str) 'regname'
46-
regaddr Read from explicit address (int) 'regaddr'
4746
regname=val Write (int) 'val' to named register (str) 'regname'
48-
regaddr=val Write (int) 'val' to explicit address (int) 'regaddr'
4947
regname=val0,...,valN Write (int) 'val0' through 'valN' to consecutive addresses beginning at the
5048
address of named register (str) 'regname'
51-
regaddr=val0,...,valN Write (int) 'val0' through 'valN' to consecutive addresses beginning at
52-
address (int) 'regaddr'
5349
regname+offset Read from address = romx['regname']['base_addr'] + (int) 'offset'
54-
regaddr+offset Read from address = (int) 'regaddr' + (int) 'offset'
5550
regname:size Read (int) 'size' elements starting from address romx['regname']['base_addr']
56-
regaddr:size Read (int) 'size' elements starting from (int) 'regaddr'
5751
regname+offset=val Write (int) 'val' to address romx['regname']['base_addr'] + (int) 'offset'
5852
regname+offset=val0,...,valN Write (int) 'val0' through 'valN' to consecutive addresses beginning at
5953
address romx['regname']['base_addr'] + (int) 'offset'
60-
regaddr+offset=val Write (int) 'val' to address (int) 'regaddr' + (int) 'offset'
61-
regaddr+offset=val0,...,valN Write (int) 'val0' through 'valN' to consecutive addresses beginning at
62-
address (int) 'regaddr'
6354
regname+offset:size Read (int) 'size' elements starting from address romx['regname']['base_addr'] + \
6455
(int) 'offset'
65-
regaddr+offset:size Read (int) 'size' elements starting from (int) 'regaddr' + (int) 'offset'
66-
I'm not sure what use case the "regaddr+offset" syntax supports, but it does no harm to include it.
6756
NOTE! Deliberately not supporting "regname-offset" (negative offsets) as it's use case is unclear
6857
and a '_' to '-' typo could potentially collide with legitimate transactions.
6958
"""
@@ -74,13 +63,16 @@ def parseTransaction(xact):
7463
size = None
7564
if _match:
7665
groups = _match.groups()
77-
regstr = groups[0] # Always starts with 'regname' or 'regaddr'
66+
regstr = groups[0] # Always starts with 'regname'
67+
if regstr.isdigit() or regstr.lower().startswith("0x") or regstr.lower().startswith("0b"):
68+
raise ValueError("Absolute numeric addresses are not allowed. Use symbolic register names instead.")
7869
if groups[1] == '=':
7970
wval = _expandWriteVals(groups[2])
8071
elif groups[1] == '+':
8172
offset = _int(groups[2])
8273
elif groups[1] == ':':
8374
size = _int(groups[2])
75+
8476
if groups[3] == '=':
8577
if groups[1] == '=':
8678
raise Exception("Malformed transaction: {}".format(xact))
@@ -91,15 +83,9 @@ def parseTransaction(xact):
9183
size = _int(groups[4])
9284
else:
9385
raise Exception("Failed to match: {}".format(xact))
94-
try:
95-
reg = _int(regstr)
96-
except ValueError:
97-
reg = regstr
86+
reg = regstr
9887
if size is None:
99-
if wval is None:
100-
size = None
101-
else:
102-
size = 0
88+
size = 0 if wval is not None else None
10389
return (reg, offset, size, wval)
10490

10591

‎leep/raw.py‎

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -106,20 +106,12 @@ def log2(n):
106106

107107

108108
def _int(s):
109+
if isinstance(s, str) and (s.isdigit() or s.lower().startswith(('0x', '0b'))):
110+
raise ValueError("Absolute numeric addressing is not allowed. Use symbolic register names instead.")
109111
try:
110-
# Catch actual ints
111112
return int(s)
112113
except ValueError:
113-
pass
114-
if hasattr(s, 'startswith'):
115-
try:
116-
if s.startswith('0x'):
117-
return int(s, 16)
118-
elif s.startswith('0b'):
119-
return int(s, 2)
120-
except ValueError:
121-
pass
122-
return None
114+
return None
123115

124116

125117
class LEEPDevice(DeviceBase):
@@ -176,9 +168,11 @@ def _decode(self, reg, instance=[]):
176168
"data_width": 32,
177169
"sign": "unsigned",
178170
}
171+
if isinstance(reg, str) and (reg.isdigit() or reg.lower().startswith(('0x', '0b'))):
172+
raise ValueError("Absolute numeric addressing is not allowed. Use symbolic register names instead.")
179173
_reg = _int(reg)
180174
if _reg is not None:
181-
return "0x{:x}".format(_reg), _reg, 1, info
175+
raise ValueError("Absolute numeric addressing is not allowed. Use symbolic register names instead.")
182176
if instance is not None:
183177
reg = self.expand_regname(reg, instance=instance)
184178
info = self.get_reg_info(reg, instance=None)

‎leep/test/test_cli.py‎

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -238,46 +238,48 @@ def test_parseTransaction():
238238
# CLI string: result (reg, offset, read_size, write_vals)
239239
# regname Read from named register (str) 'regname'
240240
"foo": ("foo", 0, None, None),
241-
# regaddr Read from explicit address (int) 'regaddr'
242-
"0x100": (0x100, 0, None, None),
243241
# regname=val Write (int) 'val' to named register (str) 'regname'
244242
"foo=42": ("foo", 0, 0, 42),
245243
"bar=0x42": ("bar", 0, 0, 0x42),
246244
"foo_baz=0b100": ("foo_baz", 0, 0, 0b100),
247-
# regaddr=val Write (int) 'val' to explicit address (int) 'regaddr'
248-
"0x123=100": (0x123, 0, 0, 100),
249-
"123=0xabc": (123, 0, 0, 0xabc),
250-
"0b1010=-10": (0b1010, 0, 0, -10),
251245
# regname=val0,...,valN Write (int) 'val0' through 'valN' to consecutive addresses beginning at the
252246
# address of named register (str) 'regname'
253247
"reg_foo=1,2,3,4,5": ("reg_foo", 0, 0, [1, 2, 3, 4, 5]),
254-
# regaddr=val0,...,valN Write (int) 'val0' through 'valN' to consecutive addresses beginning at
255-
# address (int) 'regaddr'
256-
"0x4000=1,-1,0,42,0x10": (0x4000, 0, 0, [1, -1, 0, 42, 0x10]),
257248
# regname+offset Read from address = romx['regname']['base_addr'] + (int) 'offset'
258249
"BINGO+100": ("BINGO", 100, None, None),
259-
# regaddr+offset Read from address = (int) 'regaddr' + (int) 'offset'
260-
"0x100+100": (0x100, 100, None, None),
261250
# regname:size Read (int) 'size' elements starting from address romx['regname']['base_addr']
262251
"_reg_:32": ("_reg_", 0, 32, None),
263-
# regaddr:size Read (int) 'size' elements starting from (int) 'regaddr'
264-
"0:0xff": (0, 0, 0xff, None),
265252
# regname+offset=val Write (int) 'val' to address romx['regname']['base_addr'] + (int) 'offset'
266253
"bandit+0x100=5000": ("bandit", 0x100, 0, 5000),
267254
# regname+offset=val0,...,valN Write (int) 'val0' through 'valN' to consecutive addresses beginning at
268255
# address romx['regname']['base_addr'] + (int) 'offset'
269256
"status+0x20=50,40,0x30": ("status", 0x20, 0, [50, 40, 0x30]),
270-
# regaddr+offset=val Write (int) 'val' to address (int) 'regaddr' + (int) 'offset'
271-
"128+0xc0=-1000": (128, 0xc0, 0, -1000),
272-
# regaddr+offset=val0,...,valN Write (int) 'val0' through 'valN' to consecutive addresses beginning at
273-
# address (int) 'regaddr'
274-
"0x128+0xc0=1,0,1,0,2": (0x128, 0xc0, 0, [1, 0, 1, 0, 2]),
275257
# regname+offset:size Read (int) 'size' elements starting from address romx['regname']['base_addr'] + \
276258
# (int) 'offset'
277259
"Socks+0x100:100": ("Socks", 0x100, 100, None),
278-
# regaddr+offset:size Read (int) 'size' elements starting from (int) 'regaddr' + (int) 'offset'
279-
"0x4000+15:0b1111": (0x4000, 15, 0b1111, None),
280260
}
261+
bads = [
262+
# regaddr Read from explicit address (int) 'regaddr'
263+
"0x100",
264+
# regaddr=val Write (int) 'val' to explicit address (int) 'regaddr'
265+
"0x123=100",
266+
"123=0xabc",
267+
"0b1010=-10",
268+
# regaddr=val0,...,valN Write (int) 'val0' through 'valN' to consecutive addresses beginning at
269+
# address (int) 'regaddr'
270+
"0x4000=1,-1,0,42,0x10",
271+
# regaddr+offset Read from address = (int) 'regaddr' + (int) 'offset'
272+
"0x100+100",
273+
# regaddr:size Read (int) 'size' elements starting from (int) 'regaddr'
274+
"0:0xff",
275+
# regaddr+offset=val Write (int) 'val' to address (int) 'regaddr' + (int) 'offset'
276+
"128+0xc0=-1000",
277+
# regaddr+offset=val0,...,valN Write (int) 'val0' through 'valN' to consecutive addresses beginning at
278+
# address (int) 'regaddr'
279+
"0x128+0xc0=1,0,1,0,2",
280+
# regaddr+offset:size Read (int) 'size' elements starting from (int) 'regaddr' + (int) 'offset'
281+
"0x4000+15:0b1111",
282+
]
281283
errors = 0
282284
for _input, _expected in dd.items():
283285
try:
@@ -287,6 +289,17 @@ def test_parseTransaction():
287289
if result != _expected:
288290
print("Failed on input: {}.\n Expected: {}\n Result: {}".format(_input, _expected, result))
289291
errors += 1
292+
293+
for _input in bads:
294+
try:
295+
result = parseTransaction(_input)
296+
print(f"Expected an exception for input: { _input } but got {result}")
297+
errors += 1
298+
except ValueError:
299+
pass
300+
except Exception as ex:
301+
print(f"Unexpected exception for input: { _input }: { ex }")
302+
errors += 1
290303
return errors
291304

292305

@@ -318,4 +331,8 @@ def runServer(args):
318331
parserTest = subparsers.add_parser("test", help="Run regression tests.")
319332
parserTest.set_defaults(handler=doTests)
320333
args = parser.parse_args()
321-
sys.exit(args.handler(args))
334+
try:
335+
args.handler(args)
336+
except Exception as e:
337+
print(f"Error: {e}", file=sys.stderr)
338+
sys.exit(1)

0 commit comments

Comments
 (0)