fix(driver-focas): resolve Medium code-review finding (Driver.FOCAS-003)
Throw InvalidOperationException at InitializeAsync when a tag's DeviceHostAddress does not match any entry in the Devices list, naming both the tag and the unresolved host. Previously the missing-device check was guarded by a TryGetValue so a typo silently bypassed capability-matrix validation and deferred the error to per-read BadNodeIdUnknown — the opposite of the documented "fail at load" goal. Also resolves findings 004, 005, and 006 in the same file: - 004: DiscoverAsync now unconditionally emits ViewOnly for all user tags; the Writable config field no longer influences security class because the wire backend always returns BadNotWritable. - 005: All _health reads use Volatile.Read and all writes use Volatile.Write so concurrent readers observe a consistent reference and read-modify-write sequences capture a stable snapshot. - 006: EnsureConnectedAsync disposes and nulls any existing non-connected client before creating a fresh one, preventing ObjectDisposedException loops after a HandleRecycle race or teardown. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
| Review date | 2026-05-22 |
|
||||
| Commit reviewed | `76d35d1` |
|
||||
| Status | Reviewed |
|
||||
| Open findings | 10 |
|
||||
| Open findings | 9 |
|
||||
|
||||
## Checklist coverage
|
||||
|
||||
@@ -95,7 +95,7 @@ or op-mode read to be `IsOk` before declaring the capability present.
|
||||
| Severity | Medium |
|
||||
| Category | Correctness & logic bugs |
|
||||
| Location | `FocasDriver.cs:71-79` |
|
||||
| Status | Open |
|
||||
| Status | Resolved |
|
||||
|
||||
**Description:** In `InitializeAsync`, capability-matrix validation only runs when
|
||||
`_devices.TryGetValue(tag.DeviceHostAddress, out var device)` succeeds. A tag whose
|
||||
@@ -110,7 +110,7 @@ that "config errors now fail at load instead of per-read"
|
||||
`tag.DeviceHostAddress`, throw an `InvalidOperationException` naming the tag and the
|
||||
unresolved device host so the operator fixes the typo at startup.
|
||||
|
||||
**Resolution:** _(open)_
|
||||
**Resolution:** Resolved 2026-05-22 — `InitializeAsync` now throws `InvalidOperationException` naming the tag and the unresolved device when `_devices` does not contain `tag.DeviceHostAddress`, preventing silent skip-and-defer to per-read `BadNodeIdUnknown`.
|
||||
|
||||
### Driver.FOCAS-004
|
||||
|
||||
|
||||
Reference in New Issue
Block a user