f0082af5b9
Inject the custom UnwrappedCapabilityCallAnalyzer as an OutputItemType=Analyzer ProjectReference from Directory.Build.props (excluding the analyzer + its test project) so OTOPCUA0001 runs on every src/ and tests/ compilation — it previously enforced its CapabilityInvoker-wrapping rule against nothing but its own 31 unit tests (the 'built-but-never-wired' failure mode). Triage of the ~280 surfaced hits, three categories: 1. RESILIENCE-DISPATCH-GAP (7 sites, DriverInstanceActor x6 + GenericDriverNodeManager x1): a REAL, previously-untracked gap the analyzer caught on first wiring — the Phase 6.1 CapabilityInvoker resilience pipeline (retry/breaker/bulkhead/telemetry) is constructed ONLY in tests and was never wired into the production dispatch layer. Scoped per-site #pragma with a greppable RESILIENCE-DISPATCH-GAP marker explicitly noting these are tracked-but-not-intentional, pending the dispatch-wiring remediation (filed as a follow-up). Keeps the analyzer live everywhere else in those projects so a NEW unwrapped call still fails the build. 2. Driver-INTERNAL self-calls (3 sites, AbCipAlarmProjection x2 + S7Driver x1): a driver's own poll/ack path calling its own capability method. The invoker wraps the driver from the dispatch layer OUTWARD; a driver re-wrapping its own internal calls would double-wrap. Genuinely intentional — scoped #pragma with that rationale. 3. Wire-level test suites + manual-testing CLIs (12 projects): invoke drivers directly by design — the analyzer's own documented intentional case. Project-level NoWarn with a comment. Verified: full solution build green, 0 OTOPCUA0001 hits; analyzer's 31 tests pass; negative control — dropping one dispatch-gap pragma re-fires OTOPCUA0001 and fails the Runtime build, proving the analyzer is genuinely live tree-wide, not disabled.
53 lines
3.0 KiB
XML
53 lines
3.0 KiB
XML
<Project>
|
|
<!--
|
|
Defaults inherited by every csproj. Individual projects may override.
|
|
|
|
Deviation from the original v2 plan: TreatWarningsAsErrors is NOT set globally because the
|
|
pre-v2 test projects (e.g. Admin.Tests) carry 240+ xUnit1051 analyzer warnings that would
|
|
fail the build. New v2 projects (Commons, Cluster, ControlPlane, Runtime, OpcUaServer, AdminUI,
|
|
Host, Security) MUST opt in to <TreatWarningsAsErrors>true</TreatWarningsAsErrors> in their
|
|
own csproj. Once the legacy Admin/Server projects are deleted (Phase 10, Task 56), this can
|
|
be promoted back to a global default.
|
|
-->
|
|
<PropertyGroup>
|
|
<TargetFramework>net10.0</TargetFramework>
|
|
<Nullable>enable</Nullable>
|
|
<ImplicitUsings>enable</ImplicitUsings>
|
|
<LangVersion>latest</LangVersion>
|
|
</PropertyGroup>
|
|
|
|
<!--
|
|
NuGet audit suppression: CVE-2025-6965 / GHSA-2m69-gcr7-jv3q affects the transitive native
|
|
bundle SQLitePCLRaw.lib.e_sqlite3 (advisory range <= 2.1.11), pulled in via
|
|
Microsoft.Data.Sqlite 9.0.0 -> SQLitePCLRaw.bundle_e_sqlite3 by Core.AlarmHistorian's
|
|
store-and-forward sink. As of 2026-06-20 the maintainer has NOT shipped a patched bundle
|
|
(SQLite fixed the underlying flaw upstream in 3.50.2 but no SQLitePCLRaw release embeds it
|
|
yet), so there is no package version to bump to. The flaw requires attacker-controlled
|
|
pathological aggregate SQL; the sink only issues internal parameterised statements, so the
|
|
exposure here is negligible. REMOVE this suppression once SQLitePCLRaw ships a patched native
|
|
bundle and bump Microsoft.Data.Sqlite to a release that references it.
|
|
-->
|
|
<ItemGroup>
|
|
<NuGetAuditSuppress Include="https://github.com/advisories/GHSA-2m69-gcr7-jv3q" />
|
|
</ItemGroup>
|
|
|
|
<!--
|
|
Wire the custom OTOPCUA0001 analyzer (UnwrappedCapabilityCallAnalyzer) into every project so
|
|
the CapabilityInvoker-wrapping rule is enforced tree-wide, not just against the analyzer's own
|
|
unit tests (arch-review 07/C-1 — the "built-but-never-wired" failure mode). Analyzer projects
|
|
target netstandard2.0 and are loaded into the compiler host, so OutputItemType="Analyzer" +
|
|
ReferenceOutputAssembly="false" is the correct incantation (the DLL is not linked). Excluded
|
|
from the analyzer project itself (self-reference cycle) and its test project (which already
|
|
references the analyzer directly). OTOPCUA0001 defaults to Warning; projects with genuine
|
|
intentional unwrapped calls (unit tests exercising drivers at the wire level, the invoker's own
|
|
internals) carry a scoped NoWarn / pragma — see the per-project suppressions.
|
|
-->
|
|
<ItemGroup Condition="'$(MSBuildProjectName)' != 'ZB.MOM.WW.OtOpcUa.Analyzers'
|
|
and '$(MSBuildProjectName)' != 'ZB.MOM.WW.OtOpcUa.Analyzers.Tests'">
|
|
<ProjectReference Include="$(MSBuildThisFileDirectory)src/Tooling/ZB.MOM.WW.OtOpcUa.Analyzers/ZB.MOM.WW.OtOpcUa.Analyzers.csproj"
|
|
OutputItemType="Analyzer"
|
|
ReferenceOutputAssembly="false"
|
|
PrivateAssets="all" />
|
|
</ItemGroup>
|
|
</Project>
|