fix(driver-modbus-addressing): resolve Low code-review findings (Driver.Modbus.Addressing-006,007,009)
- Driver.Modbus.Addressing-006: broaden the catch in TryParseFamilyNative so a future helper throwing a non-Argument/Overflow type still satisfies the try-parse contract. - Driver.Modbus.Addressing-007: document that the address grammar does not carry ModbusStringByteOrder (the structured-tag path does); add a 'Grammar scope' bullet to docs/v2/dl205.md. - Driver.Modbus.Addressing-009: reword the ModbusModiconAddress comments so they don't imply a leading-digit invariant the parser doesn't enforce. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -52,10 +52,14 @@ public static class ModbusModiconAddress
|
||||
return false;
|
||||
}
|
||||
|
||||
// Range check up-front — keeps the rest of the parser straight-line. 5-digit Modicon
|
||||
// is always exactly 5 chars (40001..49999, with the lead digit selecting region), and
|
||||
// 6-digit is exactly 6 (400001..465536-shaped). Anything else is unambiguously
|
||||
// malformed so we reject before doing the per-character work.
|
||||
// Range check up-front — keeps the rest of the parser straight-line. Modicon addresses
|
||||
// are exactly 5 or 6 characters: a leading region digit (0/1/3/4 — coils, discrete
|
||||
// inputs, input registers, holding registers respectively) followed by 4 (5-digit form)
|
||||
// or 5 (6-digit form) trailing digits encoding the 1-based register number. The
|
||||
// 5-digit form covers 1..9999 per region (e.g. coils 00001..09999, holding registers
|
||||
// 40001..49999); the 6-digit form covers the full 1..65536 wire range (e.g. coils
|
||||
// 000001..065536, holding 400001..465536). Anything else is unambiguously malformed so
|
||||
// we reject before doing the per-character work.
|
||||
var s = address.Trim();
|
||||
if (s.Length is not (5 or 6))
|
||||
{
|
||||
@@ -100,9 +104,10 @@ public static class ModbusModiconAddress
|
||||
return false;
|
||||
}
|
||||
|
||||
// 5-digit form caps at 9999 by construction (4 trailing digits); reject if the parsed
|
||||
// value exceeds the wire-protocol maximum of 65536 (i.e. PDU offset 65535). 6-digit
|
||||
// form can address the full 65535-offset range.
|
||||
// Wire-protocol maximum is register number 65536 (PDU offset 65535). The 5-digit form's
|
||||
// 4 trailing digits can only encode up to 9999, so this check is reached only by the
|
||||
// 6-digit form in practice — but it is applied to both for safety / simplicity rather
|
||||
// than relying on the digit-count invariant.
|
||||
if (registerNumber > 65536)
|
||||
{
|
||||
error = $"Modicon register number {registerNumber} exceeds the wire maximum (65536 / PDU offset 65535)";
|
||||
|
||||
Reference in New Issue
Block a user