diff --git a/DEVLOG.md b/DEVLOG.md index 2e8e6741..4ac0c42d 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,5 +1,149 @@ # Dev Log +## 2026-05-22 — S10.17 Network primitives conformance + +Closes S10.17 (#428). Sixth per-group conformance story in E10. Network +primitives cluster: `Datagram`, `Stream`, `Resolver`, `Address`, `Sleep`, +plus their POSIX / Windows / FreeRTOS / OpenSSL impls. Started from the +CI report at run 26303038083 (`main@2952760`, post-S08.08), which surfaced +52 unsuppressed cppcheck-misra findings in scope; clang-tidy was clean. + +### Headline + +Seven commits, one per logical fix cluster. Two refactor-shaped fixes +(Patterns B, C), two simple per-site fixes (D, E), one mechanical sweep +(A), and two suppression-list reorganisations (G, F). + +### Pattern A — `== true` at pool-allocator IsValid call sites (MISRA 14.4) + +The S10.05 audit's verdict on rule 14.4 was "single site, fixable"; the +E11 PoolAllocator rollout multiplied it to 22 sites across every pool-backed +`*Static.c::_Create`. cppcheck-misra's essential-type tracker doesn't +follow `bool`-returning function calls across the call boundary, so +`if (IsValid(...))` is flagged even though the function genuinely returns +`bool`. + +Two experiments before committing the form: + +1. De-inline `SolidSyslogPoolAllocator_IndexIsValid` from header into .c + — no effect. The cppcheck-misra tracker has the same limitation + against extern functions as against static inlines. +2. Explicit `if (... == true)` — works. The comparison yields bool, + which the tracker unambiguously sees as essentially-Boolean. + +The `== true` form is a code-smell shape (redundant comparison on a +`bool`) and David's first reaction was that he didn't like it; we +preferred it to a new deviation D.012 on weighing-up. Tree-wide sweep +applies it to all 23 sites (the 22 found in CI scope plus +`MbedTlsStreamStatic.c` which CI doesn't currently include — applying +the fix here means S10.20's CI scope widen verifies MbedTls pre-clean). + +### Pattern B — Address Static pool/fallback move (MISRA 8.9) + +Same 8.9 pattern S10.16 swept across the null-objects: file-scope +storage that's only used inside a single helper. Each Address Static +had two such statics — the pool array (used only inside +`_HandleFromIndex`) and the pool-exhaustion fallback singleton (used +only inside `_Create`). Both move inside their using function as +function-scope `static`. Local names drop the `_` prefix per +Tier 4 lowerCamelCase for locals. `InUse` and `Allocator` stay at +file scope — `InUse` is referenced at file scope in the Allocator +initializer (8.9 doesn't fire), and `Allocator` is referenced from +both `_Create` and `_Destroy` (two functions — 8.9 doesn't fire). + +### Pattern C — FreeRtos timing constants move (MISRA 8.9) + +`FreeRtosTcpStream` and `FreeRtosDatagram` each had `static const +TickType_t XXX = pdMS_TO_TICKS(N)` timing constants at file scope but +each used inside one function. Move inside the using function as +function-scope `static const`. `pdMS_TO_TICKS` is a compile-time +constant expression given `configTICK_RATE_HZ`, so the initialiser +stays valid. + +`READ_FAILED` in `FreeRtosTcpStream` stays at file scope — used by +both `_Send` and `_Read`. + +### Pattern D — `(void) memset` in Address.c Initialise (MISRA 17.7) + +Three identical sites — `Posix`, `Winsock`, `FreeRtos` Address +`_Initialise` — each calling `memset(&self->Sockaddr, 0, ...)` and +discarding the `void*` return value implicitly. Explicit `(void)` +cast satisfies 17.7. + +### Pattern E — Capture errno at the call site (MISRA 22.10) + +Three sites: PosixDatagram `sendto`, PosixTcpStream `connect`, and the +shared `PosixTcpStream_WouldBlock` helper. cppcheck-misra rule 22.10 +requires errno reads to sit immediately after the C-library function +that may set it, with no intervening calls — the `else if (errno == ...)` +shape after a `>= 0` check trips the rule, and a helper that reads +errno at the bottom of a call stack can't satisfy the locality test at +all. + +Three fixes: +- PosixDatagram_SendTo: `int sendErrno = (sent < 0) ? errno : 0;` + immediately after `sendto`; test the local. +- PosixTcpStream_Connect: same shape with `connectErrno`. +- PosixTcpStream_WouldBlock: change signature to take `int err` so + the helper is pure; `_Read` captures `recvErrno` immediately after + `recv` and passes it in. + +### Pattern G — D.009 widens to absorb 7 anonymous-enum 5.7 sites + 1 new entry + 1 unmasked 2.4 + +Seven 5.7-on-anonymous-enum suppressions migrated from the D.003 block +to the D.009 block: `TlsStream`, `GetAddrInfoResolver`, `PosixDatagram`, +`PosixSleep`, `PosixTcpStream`, `WinsockResolver`, `WinsockTcpStream`, +plus `FreeRtosTcpStream` whose anchor also shifted :45 → :27 after +Pattern C removed three file-scope timing constants. + +One new D.009 entry for `FreeRtosResolver.c:21` — the +`GETADDRINFO_SUCCESS` anonymous enum landed by S08.08. + +One new D.009 2.4 entry for `UdpPayload.h:15` — the 2.4 was always +there but masked by cppcheck's dedup against the existing 5.7 +suppression; surfaced once Pattern C narrowed the FreeRtos transport +inclusion chain. Same unmasking phenomenon S10.16's DEVLOG flagged. + +Only one true struct-tag 5.7 in scope (`SolidSyslogAddress.h:10`) +stays in the D.003 block. + +### Pattern F — D.002 anchor refresh + new sites + +Pattern B/C/E moves shifted line numbers in several files. Anchor +refresh on the affected D.002 11.2 / 11.3 / 11.5 suppressions +(11 in-scope refreshes), plus: + +- 3 new 11.2 entries for Address.c sources — cppcheck-misra fires both + 11.2 and 11.3 at the same opaque-impl downcast line in `_Initialise`; + only 11.3 was historically suppressed. +- 4 11.3 orphan refreshes outside S10.17's strict scope + (StdAtomicCounter, WindowsAtomicCounter, FreeRtosMutex, FatFsFile) — + pre-existing anchor drift caused by the E11 `*Static.c` split. Same + fix-when-we-see-it precedent as S10.16's null-object sweep, no need + to revisit closed S10.13. + +### Acceptance + +- Zero in-scope cppcheck-misra unsuppressed findings. +- Zero in-scope `analyze-tidy` warnings. +- 1290 / 1290 tests pass on `debug` and `sanitize` (ASan + UBSan). +- Tree-wide coverage 99.9% (2924 / 2928 lines, 602 / 602 functions); + uncovered lines sit in `BlockStoreStatic.c` and `PosixMutex.c` and + are pre-existing — none of the changed files lost coverage. +- clang-format clean tree-wide. +- No new deviation rows in `docs/misra-deviations.md`; count bumps on + D.002 (3 new 11.2 entries) and D.009 (1 new 5.7 + 1 new 2.4). + +### Carry-forward for S10.18 / S10.19 / S10.20 + +- Same `== true` form will need extending to any new pool-backed class + that lands before S10.20 (rare — most classes are already split). +- Sister anonymous-enum 5.7 sites in the D.003 block belong to storage + / engine groups (`BlockSequence`, `RecordStore`, `Circular*`, `Crc16`, + `FileBlockDevice`, etc.) — S10.18 / S10.19 migrate them. + +--- + ## 2026-05-22 — S10.16 Senders conformance Closes S10.16 (#389). Fifth per-group conformance story in E10, diff --git a/Platform/Atomics/Source/SolidSyslogStdAtomicCounterStatic.c b/Platform/Atomics/Source/SolidSyslogStdAtomicCounterStatic.c index 728b21e7..a25b85fe 100644 --- a/Platform/Atomics/Source/SolidSyslogStdAtomicCounterStatic.c +++ b/Platform/Atomics/Source/SolidSyslogStdAtomicCounterStatic.c @@ -27,7 +27,7 @@ struct SolidSyslogAtomicCounter* SolidSyslogStdAtomicCounter_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&StdAtomicCounter_Allocator); struct SolidSyslogAtomicCounter* handle = SolidSyslogNullAtomicCounter_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&StdAtomicCounter_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&StdAtomicCounter_Allocator, index) == true) { StdAtomicCounter_Initialise(&StdAtomicCounter_Pool[index].Base); handle = &StdAtomicCounter_Pool[index].Base; diff --git a/Platform/FatFs/Source/SolidSyslogFatFsFileStatic.c b/Platform/FatFs/Source/SolidSyslogFatFsFileStatic.c index ccc3c334..dbd252ca 100644 --- a/Platform/FatFs/Source/SolidSyslogFatFsFileStatic.c +++ b/Platform/FatFs/Source/SolidSyslogFatFsFileStatic.c @@ -24,7 +24,7 @@ struct SolidSyslogFile* SolidSyslogFatFsFile_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&FatFsFile_Allocator); struct SolidSyslogFile* handle = SolidSyslogNullFile_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&FatFsFile_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&FatFsFile_Allocator, index) == true) { FatFsFile_Initialise(&FatFsFile_Pool[index].Base); handle = &FatFsFile_Pool[index].Base; diff --git a/Platform/FreeRtos/Source/SolidSyslogFreeRtosAddress.c b/Platform/FreeRtos/Source/SolidSyslogFreeRtosAddress.c index f09c7bac..bfc8abeb 100644 --- a/Platform/FreeRtos/Source/SolidSyslogFreeRtosAddress.c +++ b/Platform/FreeRtos/Source/SolidSyslogFreeRtosAddress.c @@ -7,7 +7,7 @@ struct SolidSyslogAddress; void FreeRtosAddress_Initialise(struct SolidSyslogAddress* base) { struct SolidSyslogFreeRtosAddress* self = (struct SolidSyslogFreeRtosAddress*) base; - memset(&self->Sockaddr, 0, sizeof(self->Sockaddr)); + (void) memset(&self->Sockaddr, 0, sizeof(self->Sockaddr)); } void FreeRtosAddress_Cleanup(struct SolidSyslogAddress* base) diff --git a/Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressStatic.c b/Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressStatic.c index d6e898df..b5844e1d 100644 --- a/Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressStatic.c +++ b/Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressStatic.c @@ -17,24 +17,24 @@ static inline size_t FreeRtosAddress_IndexFromHandle(const struct SolidSyslogAdd static inline void FreeRtosAddress_CleanupAtIndex(size_t index, void* context); static bool FreeRtosAddress_InUse[SOLIDSYSLOG_ADDRESS_POOL_SIZE]; -static struct SolidSyslogFreeRtosAddress FreeRtosAddress_Pool[SOLIDSYSLOG_ADDRESS_POOL_SIZE]; static struct SolidSyslogPoolAllocator FreeRtosAddress_Allocator = { FreeRtosAddress_InUse, SOLIDSYSLOG_ADDRESS_POOL_SIZE }; -/* TU-private fallback returned when the pool is exhausted. Sized as a real - * SolidSyslogFreeRtosAddress so a Resolver overwrite at the exhausted-fallback - * call site is bounded — same freertos_sockaddr storage as any pooled slot. - * Not a per-Sender slot: multi-overflow integrators share this storage and - * race on it. Bumping SOLIDSYSLOG_ADDRESS_POOL_SIZE removes the race. */ -static struct SolidSyslogFreeRtosAddress FreeRtosAddress_Fallback; - struct SolidSyslogAddress* SolidSyslogFreeRtosAddress_Create(void) { + /* TU-private fallback returned when the pool is exhausted. Sized as + * a real SolidSyslogFreeRtosAddress so a Resolver overwrite at the + * exhausted-fallback call site is bounded — same freertos_sockaddr + * storage as any pooled slot. Not a per-Sender slot: multi-overflow + * integrators share this storage and race on it. Bumping + * SOLIDSYSLOG_ADDRESS_POOL_SIZE removes the race. */ + static struct SolidSyslogFreeRtosAddress fallback; + size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&FreeRtosAddress_Allocator); - struct SolidSyslogAddress* handle = (struct SolidSyslogAddress*) &FreeRtosAddress_Fallback; - if (SolidSyslogPoolAllocator_IndexIsValid(&FreeRtosAddress_Allocator, index)) + struct SolidSyslogAddress* handle = (struct SolidSyslogAddress*) &fallback; + if (SolidSyslogPoolAllocator_IndexIsValid(&FreeRtosAddress_Allocator, index) == true) { handle = FreeRtosAddress_HandleFromIndex(index); FreeRtosAddress_Initialise(handle); @@ -48,7 +48,8 @@ struct SolidSyslogAddress* SolidSyslogFreeRtosAddress_Create(void) static inline struct SolidSyslogAddress* FreeRtosAddress_HandleFromIndex(size_t index) { - return (struct SolidSyslogAddress*) &FreeRtosAddress_Pool[index]; + static struct SolidSyslogFreeRtosAddress pool[SOLIDSYSLOG_ADDRESS_POOL_SIZE]; + return (struct SolidSyslogAddress*) &pool[index]; } void SolidSyslogFreeRtosAddress_Destroy(struct SolidSyslogAddress* base) diff --git a/Platform/FreeRtos/Source/SolidSyslogFreeRtosDatagram.c b/Platform/FreeRtos/Source/SolidSyslogFreeRtosDatagram.c index 100617cc..5ad5ce28 100644 --- a/Platform/FreeRtos/Source/SolidSyslogFreeRtosDatagram.c +++ b/Platform/FreeRtos/Source/SolidSyslogFreeRtosDatagram.c @@ -18,13 +18,6 @@ #include "SolidSyslogNullDatagram.h" #include "SolidSyslogUdpPayload.h" -/* Time the calling task yields after issuing an ARP probe so the IP task can - * receive the reply and populate the cache before we attempt FreeRTOS_sendto. - * 50 ms is generous against typical sub-millisecond LAN ARP RTT but short - * enough that the first send latency stays tolerable. If the reply hasn't - * arrived in time the sendto is allowed to fail or be dropped — UDP semantics. */ -static const TickType_t ARP_RESOLUTION_WAIT_TICKS = pdMS_TO_TICKS(50); - static bool FreeRtosDatagram_Open(struct SolidSyslogDatagram* base); static enum SolidSyslogDatagramSendResult FreeRtosDatagram_SendTo( struct SolidSyslogDatagram* base, @@ -117,6 +110,14 @@ static enum SolidSyslogDatagramSendResult FreeRtosDatagram_SendTo( * retry belongs in the store-and-forward layer above, not here. */ static inline void FreeRtosDatagram_PrimeArpIfMissing(uint32_t ip) { + /* Time the calling task yields after issuing an ARP probe so the IP + * task can receive the reply and populate the cache before we + * attempt FreeRTOS_sendto. 50 ms is generous against typical + * sub-millisecond LAN ARP RTT but short enough that the first send + * latency stays tolerable. If the reply hasn't arrived in time the + * sendto is allowed to fail or be dropped — UDP semantics. */ + static const TickType_t ARP_RESOLUTION_WAIT_TICKS = pdMS_TO_TICKS(50); + if (xIsIPInARPCache(ip) == pdFALSE) { FreeRTOS_OutputARPRequest(ip); diff --git a/Platform/FreeRtos/Source/SolidSyslogFreeRtosDatagramStatic.c b/Platform/FreeRtos/Source/SolidSyslogFreeRtosDatagramStatic.c index 78a85d48..d4d07829 100644 --- a/Platform/FreeRtos/Source/SolidSyslogFreeRtosDatagramStatic.c +++ b/Platform/FreeRtos/Source/SolidSyslogFreeRtosDatagramStatic.c @@ -27,7 +27,7 @@ struct SolidSyslogDatagram* SolidSyslogFreeRtosDatagram_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&FreeRtosDatagram_Allocator); struct SolidSyslogDatagram* handle = SolidSyslogNullDatagram_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&FreeRtosDatagram_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&FreeRtosDatagram_Allocator, index) == true) { FreeRtosDatagram_Initialise(&FreeRtosDatagram_Pool[index].Base); handle = &FreeRtosDatagram_Pool[index].Base; diff --git a/Platform/FreeRtos/Source/SolidSyslogFreeRtosMutexStatic.c b/Platform/FreeRtos/Source/SolidSyslogFreeRtosMutexStatic.c index 88ccb2c0..d0c90c3e 100644 --- a/Platform/FreeRtos/Source/SolidSyslogFreeRtosMutexStatic.c +++ b/Platform/FreeRtos/Source/SolidSyslogFreeRtosMutexStatic.c @@ -27,7 +27,7 @@ struct SolidSyslogMutex* SolidSyslogFreeRtosMutex_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&FreeRtosMutex_Allocator); struct SolidSyslogMutex* handle = SolidSyslogNullMutex_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&FreeRtosMutex_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&FreeRtosMutex_Allocator, index) == true) { FreeRtosMutex_Initialise(&FreeRtosMutex_Pool[index].Base); handle = &FreeRtosMutex_Pool[index].Base; diff --git a/Platform/FreeRtos/Source/SolidSyslogFreeRtosResolverStatic.c b/Platform/FreeRtos/Source/SolidSyslogFreeRtosResolverStatic.c index 131a69ea..42cd7da1 100644 --- a/Platform/FreeRtos/Source/SolidSyslogFreeRtosResolverStatic.c +++ b/Platform/FreeRtos/Source/SolidSyslogFreeRtosResolverStatic.c @@ -27,7 +27,7 @@ struct SolidSyslogResolver* SolidSyslogFreeRtosResolver_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&FreeRtosResolver_Allocator); struct SolidSyslogResolver* handle = SolidSyslogNullResolver_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&FreeRtosResolver_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&FreeRtosResolver_Allocator, index) == true) { FreeRtosResolver_Initialise(&FreeRtosResolver_Pool[index].Base); handle = &FreeRtosResolver_Pool[index].Base; diff --git a/Platform/FreeRtos/Source/SolidSyslogFreeRtosTcpStream.c b/Platform/FreeRtos/Source/SolidSyslogFreeRtosTcpStream.c index 08685079..7edff9bc 100644 --- a/Platform/FreeRtos/Source/SolidSyslogFreeRtosTcpStream.c +++ b/Platform/FreeRtos/Source/SolidSyslogFreeRtosTcpStream.c @@ -19,24 +19,6 @@ #include "SolidSyslogStream.h" #include "SolidSyslogStreamDefinition.h" -/* 200 ms is short enough that the Service task keeps draining predictably - * during an outage, long enough for a healthy peer to ACK over slirp/LAN. - * Both SO_SNDTIMEO and SO_RCVTIMEO are set before FreeRTOS_connect — - * upstream gates connect on SO_RCVTIMEO, but we set both as belt-and-braces - * against an upstream change. After connect both timeouts go back to 0 so - * subsequent Send/Read follow the non-blocking single-call contract from - * SolidSyslogStream. */ -static const TickType_t CONNECT_TIMEOUT_TICKS = pdMS_TO_TICKS(200); -static const TickType_t NO_TIMEOUT_TICKS = 0; - -/* Yield window for the IP task to receive an ARP reply and populate the - * cache before we attempt FreeRTOS_connect. Mirrors the established - * SolidSyslogFreeRtosDatagram pattern (see [[freertos-arp-first-packet]]) — - * without this, a cold-start TCP connect fires SYN before ARP resolves, the - * SYN is dropped at the IP layer, and the bounded 200 ms RCV-timeout - * connect expires before the retransmit ARP-and-resend cycle completes. */ -static const TickType_t ARP_RESOLUTION_WAIT_TICKS = pdMS_TO_TICKS(50); - /* SolidSyslogStream_Read returns < 0 to signal EOF/error (socket closed * internally); -1 is the in-tree convention shared with Posix/Winsock. */ static const SolidSyslogSsize READ_FAILED = -1; @@ -170,6 +152,16 @@ static bool FreeRtosTcpStream_TryConnect( const struct SolidSyslogAddress* addr ) { + /* 200 ms is short enough that the Service task keeps draining + * predictably during an outage, long enough for a healthy peer to + * ACK over slirp/LAN. Both SO_SNDTIMEO and SO_RCVTIMEO are set + * before FreeRTOS_connect — upstream gates connect on SO_RCVTIMEO, + * but we set both as belt-and-braces against an upstream change. + * After connect both timeouts go back to 0 so subsequent Send/Read + * follow the non-blocking single-call contract from + * SolidSyslogStream. */ + static const TickType_t CONNECT_TIMEOUT_TICKS = pdMS_TO_TICKS(200); + const struct freertos_sockaddr* dest = SolidSyslogFreeRtosAddress_AsConstFreertosSockaddr(addr); FreeRtosTcpStream_PrimeArpIfMissing(dest->sin_address.ulIP_IPv4); FreeRtosTcpStream_SetSendTimeout(self->Socket, CONNECT_TIMEOUT_TICKS); @@ -184,6 +176,15 @@ static bool FreeRtosTcpStream_TryConnect( * cycle completes. Symmetric with SolidSyslogFreeRtosDatagram::SendTo. */ static inline void FreeRtosTcpStream_PrimeArpIfMissing(uint32_t ip) { + /* Yield window for the IP task to receive an ARP reply and populate + * the cache before we attempt FreeRTOS_connect. Mirrors the + * established SolidSyslogFreeRtosDatagram pattern (see + * [[freertos-arp-first-packet]]) — without this, a cold-start TCP + * connect fires SYN before ARP resolves, the SYN is dropped at the + * IP layer, and the bounded 200 ms RCV-timeout connect expires + * before the retransmit ARP-and-resend cycle completes. */ + static const TickType_t ARP_RESOLUTION_WAIT_TICKS = pdMS_TO_TICKS(50); + if (xIsIPInARPCache(ip) == pdFALSE) { FreeRTOS_OutputARPRequest(ip); @@ -193,6 +194,8 @@ static inline void FreeRtosTcpStream_PrimeArpIfMissing(uint32_t ip) static void FreeRtosTcpStream_ClearTimeouts(Socket_t socket) { + static const TickType_t NO_TIMEOUT_TICKS = 0; + FreeRtosTcpStream_SetSendTimeout(socket, NO_TIMEOUT_TICKS); FreeRtosTcpStream_SetRecvTimeout(socket, NO_TIMEOUT_TICKS); } diff --git a/Platform/FreeRtos/Source/SolidSyslogFreeRtosTcpStreamStatic.c b/Platform/FreeRtos/Source/SolidSyslogFreeRtosTcpStreamStatic.c index 8161ef99..7106b16f 100644 --- a/Platform/FreeRtos/Source/SolidSyslogFreeRtosTcpStreamStatic.c +++ b/Platform/FreeRtos/Source/SolidSyslogFreeRtosTcpStreamStatic.c @@ -27,7 +27,7 @@ struct SolidSyslogStream* SolidSyslogFreeRtosTcpStream_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&FreeRtosTcpStream_Allocator); struct SolidSyslogStream* handle = SolidSyslogNullStream_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&FreeRtosTcpStream_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&FreeRtosTcpStream_Allocator, index) == true) { FreeRtosTcpStream_Initialise(&FreeRtosTcpStream_Pool[index].Base); handle = &FreeRtosTcpStream_Pool[index].Base; diff --git a/Platform/MbedTls/Source/SolidSyslogMbedTlsStreamStatic.c b/Platform/MbedTls/Source/SolidSyslogMbedTlsStreamStatic.c index 0f87f79c..70dd5e05 100644 --- a/Platform/MbedTls/Source/SolidSyslogMbedTlsStreamStatic.c +++ b/Platform/MbedTls/Source/SolidSyslogMbedTlsStreamStatic.c @@ -27,7 +27,7 @@ struct SolidSyslogStream* SolidSyslogMbedTlsStream_Create(const struct SolidSysl { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&MbedTlsStream_Allocator); struct SolidSyslogStream* handle = SolidSyslogNullStream_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&MbedTlsStream_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&MbedTlsStream_Allocator, index) == true) { MbedTlsStream_Initialise(&MbedTlsStream_Pool[index].Base, config); handle = &MbedTlsStream_Pool[index].Base; diff --git a/Platform/OpenSsl/Source/SolidSyslogTlsStreamStatic.c b/Platform/OpenSsl/Source/SolidSyslogTlsStreamStatic.c index 96d83cdc..a25c8347 100644 --- a/Platform/OpenSsl/Source/SolidSyslogTlsStreamStatic.c +++ b/Platform/OpenSsl/Source/SolidSyslogTlsStreamStatic.c @@ -24,7 +24,7 @@ struct SolidSyslogStream* SolidSyslogTlsStream_Create(const struct SolidSyslogTl { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&TlsStream_Allocator); struct SolidSyslogStream* handle = SolidSyslogNullStream_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&TlsStream_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&TlsStream_Allocator, index) == true) { TlsStream_Initialise(&TlsStream_Pool[index].Base, config); handle = &TlsStream_Pool[index].Base; diff --git a/Platform/Posix/Source/SolidSyslogGetAddrInfoResolverStatic.c b/Platform/Posix/Source/SolidSyslogGetAddrInfoResolverStatic.c index 17b29cdf..73763c7a 100644 --- a/Platform/Posix/Source/SolidSyslogGetAddrInfoResolverStatic.c +++ b/Platform/Posix/Source/SolidSyslogGetAddrInfoResolverStatic.c @@ -27,7 +27,7 @@ struct SolidSyslogResolver* SolidSyslogGetAddrInfoResolver_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&GetAddrInfoResolver_Allocator); struct SolidSyslogResolver* handle = SolidSyslogNullResolver_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&GetAddrInfoResolver_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&GetAddrInfoResolver_Allocator, index) == true) { GetAddrInfoResolver_Initialise(&GetAddrInfoResolver_Pool[index].Base); handle = &GetAddrInfoResolver_Pool[index].Base; diff --git a/Platform/Posix/Source/SolidSyslogPosixAddress.c b/Platform/Posix/Source/SolidSyslogPosixAddress.c index d5182f25..8b6ea172 100644 --- a/Platform/Posix/Source/SolidSyslogPosixAddress.c +++ b/Platform/Posix/Source/SolidSyslogPosixAddress.c @@ -8,7 +8,7 @@ struct SolidSyslogAddress; void PosixAddress_Initialise(struct SolidSyslogAddress* base) { struct SolidSyslogPosixAddress* self = (struct SolidSyslogPosixAddress*) base; - memset(&self->Sockaddr, 0, sizeof(self->Sockaddr)); + (void) memset(&self->Sockaddr, 0, sizeof(self->Sockaddr)); } void PosixAddress_Cleanup(struct SolidSyslogAddress* base) diff --git a/Platform/Posix/Source/SolidSyslogPosixAddressStatic.c b/Platform/Posix/Source/SolidSyslogPosixAddressStatic.c index 0b53d630..76dafbc6 100644 --- a/Platform/Posix/Source/SolidSyslogPosixAddressStatic.c +++ b/Platform/Posix/Source/SolidSyslogPosixAddressStatic.c @@ -17,21 +17,21 @@ static inline size_t PosixAddress_IndexFromHandle(const struct SolidSyslogAddres static inline void PosixAddress_CleanupAtIndex(size_t index, void* context); static bool PosixAddress_InUse[SOLIDSYSLOG_ADDRESS_POOL_SIZE]; -static struct SolidSyslogPosixAddress PosixAddress_Pool[SOLIDSYSLOG_ADDRESS_POOL_SIZE]; static struct SolidSyslogPoolAllocator PosixAddress_Allocator = {PosixAddress_InUse, SOLIDSYSLOG_ADDRESS_POOL_SIZE}; -/* TU-private fallback returned when the pool is exhausted. Sized as a real - * SolidSyslogPosixAddress so a Resolver overwrite at the exhausted-fallback - * call site is bounded — same sockaddr_in storage as any pooled slot. Not - * a per-Sender slot: multi-overflow integrators share this storage and - * race on it. Bumping SOLIDSYSLOG_ADDRESS_POOL_SIZE removes the race. */ -static struct SolidSyslogPosixAddress PosixAddress_Fallback; - struct SolidSyslogAddress* SolidSyslogPosixAddress_Create(void) { + /* TU-private fallback returned when the pool is exhausted. Sized as + * a real SolidSyslogPosixAddress so a Resolver overwrite at the + * exhausted-fallback call site is bounded — same sockaddr_in storage + * as any pooled slot. Not a per-Sender slot: multi-overflow integrators + * share this storage and race on it. Bumping SOLIDSYSLOG_ADDRESS_POOL_SIZE + * removes the race. */ + static struct SolidSyslogPosixAddress fallback; + size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&PosixAddress_Allocator); - struct SolidSyslogAddress* handle = (struct SolidSyslogAddress*) &PosixAddress_Fallback; - if (SolidSyslogPoolAllocator_IndexIsValid(&PosixAddress_Allocator, index)) + struct SolidSyslogAddress* handle = (struct SolidSyslogAddress*) &fallback; + if (SolidSyslogPoolAllocator_IndexIsValid(&PosixAddress_Allocator, index) == true) { handle = PosixAddress_HandleFromIndex(index); PosixAddress_Initialise(handle); @@ -45,7 +45,8 @@ struct SolidSyslogAddress* SolidSyslogPosixAddress_Create(void) static inline struct SolidSyslogAddress* PosixAddress_HandleFromIndex(size_t index) { - return (struct SolidSyslogAddress*) &PosixAddress_Pool[index]; + static struct SolidSyslogPosixAddress pool[SOLIDSYSLOG_ADDRESS_POOL_SIZE]; + return (struct SolidSyslogAddress*) &pool[index]; } void SolidSyslogPosixAddress_Destroy(struct SolidSyslogAddress* base) diff --git a/Platform/Posix/Source/SolidSyslogPosixDatagram.c b/Platform/Posix/Source/SolidSyslogPosixDatagram.c index bdbad0a1..87692499 100644 --- a/Platform/Posix/Source/SolidSyslogPosixDatagram.c +++ b/Platform/Posix/Source/SolidSyslogPosixDatagram.c @@ -95,11 +95,15 @@ static enum SolidSyslogDatagramSendResult PosixDatagram_SendTo( { const struct sockaddr_in* sin = SolidSyslogPosixAddress_AsConstSockaddrIn(addr); ssize_t sent = sendto(self->Fd, buffer, size, 0, (const struct sockaddr*) sin, sizeof(*sin)); + /* Capture errno immediately after sendto so the EMSGSIZE test below + * satisfies MISRA 22.10 — no intervening C-library calls between + * the errno-setting function and the read. */ + int sendErrno = (sent < 0) ? errno : 0; if (sent >= 0) { result = SOLIDSYSLOG_DATAGRAM_SEND_RESULT_SENT; } - else if (errno == EMSGSIZE) + else if (sendErrno == EMSGSIZE) { result = SOLIDSYSLOG_DATAGRAM_SEND_RESULT_OVERSIZE; } diff --git a/Platform/Posix/Source/SolidSyslogPosixDatagramStatic.c b/Platform/Posix/Source/SolidSyslogPosixDatagramStatic.c index 2a5ebf41..8ca2e855 100644 --- a/Platform/Posix/Source/SolidSyslogPosixDatagramStatic.c +++ b/Platform/Posix/Source/SolidSyslogPosixDatagramStatic.c @@ -27,7 +27,7 @@ struct SolidSyslogDatagram* SolidSyslogPosixDatagram_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&PosixDatagram_Allocator); struct SolidSyslogDatagram* handle = SolidSyslogNullDatagram_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&PosixDatagram_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&PosixDatagram_Allocator, index) == true) { PosixDatagram_Initialise(&PosixDatagram_Pool[index].Base); handle = &PosixDatagram_Pool[index].Base; diff --git a/Platform/Posix/Source/SolidSyslogPosixFileStatic.c b/Platform/Posix/Source/SolidSyslogPosixFileStatic.c index de67bf69..4ac564c6 100644 --- a/Platform/Posix/Source/SolidSyslogPosixFileStatic.c +++ b/Platform/Posix/Source/SolidSyslogPosixFileStatic.c @@ -24,7 +24,7 @@ struct SolidSyslogFile* SolidSyslogPosixFile_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&PosixFile_Allocator); struct SolidSyslogFile* handle = SolidSyslogNullFile_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&PosixFile_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&PosixFile_Allocator, index) == true) { PosixFile_Initialise(&PosixFile_Pool[index].Base); handle = &PosixFile_Pool[index].Base; diff --git a/Platform/Posix/Source/SolidSyslogPosixMessageQueueBufferStatic.c b/Platform/Posix/Source/SolidSyslogPosixMessageQueueBufferStatic.c index dd1b0fe0..f0268ecb 100644 --- a/Platform/Posix/Source/SolidSyslogPosixMessageQueueBufferStatic.c +++ b/Platform/Posix/Source/SolidSyslogPosixMessageQueueBufferStatic.c @@ -34,7 +34,7 @@ struct SolidSyslogBuffer* SolidSyslogPosixMessageQueueBuffer_Create(size_t maxMe { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&PosixMessageQueueBuffer_Allocator); struct SolidSyslogBuffer* handle = SolidSyslogNullBuffer_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&PosixMessageQueueBuffer_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&PosixMessageQueueBuffer_Allocator, index) == true) { PosixMessageQueueBuffer_Initialise( &PosixMessageQueueBuffer_Pool[index].Base, diff --git a/Platform/Posix/Source/SolidSyslogPosixMutexStatic.c b/Platform/Posix/Source/SolidSyslogPosixMutexStatic.c index 222da28e..f936ef91 100644 --- a/Platform/Posix/Source/SolidSyslogPosixMutexStatic.c +++ b/Platform/Posix/Source/SolidSyslogPosixMutexStatic.c @@ -24,7 +24,7 @@ struct SolidSyslogMutex* SolidSyslogPosixMutex_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&PosixMutex_Allocator); struct SolidSyslogMutex* handle = SolidSyslogNullMutex_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&PosixMutex_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&PosixMutex_Allocator, index) == true) { PosixMutex_Initialise(&PosixMutex_Pool[index].Base); handle = &PosixMutex_Pool[index].Base; diff --git a/Platform/Posix/Source/SolidSyslogPosixTcpStream.c b/Platform/Posix/Source/SolidSyslogPosixTcpStream.c index bc4aeb06..8df2aabb 100644 --- a/Platform/Posix/Source/SolidSyslogPosixTcpStream.c +++ b/Platform/Posix/Source/SolidSyslogPosixTcpStream.c @@ -58,7 +58,7 @@ static bool PosixTcpStream_Connect(int fd, const struct sockaddr_in* sin); static bool PosixTcpStream_WaitForConnectCompletion(int fd); static bool PosixTcpStream_ReadDeferredConnectError(int fd); static bool PosixTcpStream_WroteAllBytes(ssize_t sent, size_t expected); -static inline bool PosixTcpStream_WouldBlock(void); +static inline bool PosixTcpStream_WouldBlock(int err); void PosixTcpStream_Initialise(struct SolidSyslogStream* base) { @@ -184,12 +184,16 @@ static bool PosixTcpStream_Connect(int fd, const struct sockaddr_in* sin) { bool connected = false; int rc = connect(fd, (const struct sockaddr*) sin, sizeof(*sin)); + /* Capture errno immediately after connect so the EINPROGRESS test + * below satisfies MISRA 22.10 — no intervening C-library calls + * between the errno-setting function and the read. */ + int connectErrno = (rc < 0) ? errno : 0; if (rc == 0) { connected = true; } - else if (errno == EINPROGRESS) + else if (connectErrno == EINPROGRESS) { connected = PosixTcpStream_WaitForConnectCompletion(fd) && PosixTcpStream_ReadDeferredConnectError(fd); } @@ -248,13 +252,17 @@ static SolidSyslogSsize PosixTcpStream_Read(struct SolidSyslogStream* base, void { struct SolidSyslogPosixTcpStream* self = PosixTcpStream_SelfFromBase(base); ssize_t n = recv(self->Fd, buffer, size, 0); + /* Capture errno immediately after recv so the WouldBlock test below + * satisfies MISRA 22.10 — passing the captured value into the helper + * keeps the predicate pure and decouples it from errno's lifetime. */ + int recvErrno = (n < 0) ? errno : 0; SolidSyslogSsize result = -1; if (n > 0) { result = (SolidSyslogSsize) n; } - else if ((n < 0) && PosixTcpStream_WouldBlock()) + else if ((n < 0) && PosixTcpStream_WouldBlock(recvErrno)) { result = 0; } @@ -265,9 +273,9 @@ static SolidSyslogSsize PosixTcpStream_Read(struct SolidSyslogStream* base, void return result; } -static inline bool PosixTcpStream_WouldBlock(void) +static inline bool PosixTcpStream_WouldBlock(int err) { - return (errno == EAGAIN) || (errno == EWOULDBLOCK); + return (err == EAGAIN) || (err == EWOULDBLOCK); } static void PosixTcpStream_Close(struct SolidSyslogStream* base) diff --git a/Platform/Posix/Source/SolidSyslogPosixTcpStreamStatic.c b/Platform/Posix/Source/SolidSyslogPosixTcpStreamStatic.c index 93c3f5bb..c61920d1 100644 --- a/Platform/Posix/Source/SolidSyslogPosixTcpStreamStatic.c +++ b/Platform/Posix/Source/SolidSyslogPosixTcpStreamStatic.c @@ -27,7 +27,7 @@ struct SolidSyslogStream* SolidSyslogPosixTcpStream_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&PosixTcpStream_Allocator); struct SolidSyslogStream* handle = SolidSyslogNullStream_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&PosixTcpStream_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&PosixTcpStream_Allocator, index) == true) { PosixTcpStream_Initialise(&PosixTcpStream_Pool[index].Base); handle = &PosixTcpStream_Pool[index].Base; diff --git a/Platform/Windows/Source/SolidSyslogWindowsAtomicCounterStatic.c b/Platform/Windows/Source/SolidSyslogWindowsAtomicCounterStatic.c index 648b6dab..f66f0a0b 100644 --- a/Platform/Windows/Source/SolidSyslogWindowsAtomicCounterStatic.c +++ b/Platform/Windows/Source/SolidSyslogWindowsAtomicCounterStatic.c @@ -27,7 +27,7 @@ struct SolidSyslogAtomicCounter* SolidSyslogWindowsAtomicCounter_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&WindowsAtomicCounter_Allocator); struct SolidSyslogAtomicCounter* handle = SolidSyslogNullAtomicCounter_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&WindowsAtomicCounter_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&WindowsAtomicCounter_Allocator, index) == true) { WindowsAtomicCounter_Initialise(&WindowsAtomicCounter_Pool[index].Base); handle = &WindowsAtomicCounter_Pool[index].Base; diff --git a/Platform/Windows/Source/SolidSyslogWindowsFileStatic.c b/Platform/Windows/Source/SolidSyslogWindowsFileStatic.c index fceeedcf..cff2d099 100644 --- a/Platform/Windows/Source/SolidSyslogWindowsFileStatic.c +++ b/Platform/Windows/Source/SolidSyslogWindowsFileStatic.c @@ -24,7 +24,7 @@ struct SolidSyslogFile* SolidSyslogWindowsFile_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&WindowsFile_Allocator); struct SolidSyslogFile* handle = SolidSyslogNullFile_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&WindowsFile_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&WindowsFile_Allocator, index) == true) { WindowsFile_Initialise(&WindowsFile_Pool[index].Base); handle = &WindowsFile_Pool[index].Base; diff --git a/Platform/Windows/Source/SolidSyslogWindowsMutexStatic.c b/Platform/Windows/Source/SolidSyslogWindowsMutexStatic.c index ab8f4f88..564814cc 100644 --- a/Platform/Windows/Source/SolidSyslogWindowsMutexStatic.c +++ b/Platform/Windows/Source/SolidSyslogWindowsMutexStatic.c @@ -27,7 +27,7 @@ struct SolidSyslogMutex* SolidSyslogWindowsMutex_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&WindowsMutex_Allocator); struct SolidSyslogMutex* handle = SolidSyslogNullMutex_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&WindowsMutex_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&WindowsMutex_Allocator, index) == true) { WindowsMutex_Initialise(&WindowsMutex_Pool[index].Base); handle = &WindowsMutex_Pool[index].Base; diff --git a/Platform/Windows/Source/SolidSyslogWinsockAddress.c b/Platform/Windows/Source/SolidSyslogWinsockAddress.c index 6b1b700e..7578de76 100644 --- a/Platform/Windows/Source/SolidSyslogWinsockAddress.c +++ b/Platform/Windows/Source/SolidSyslogWinsockAddress.c @@ -7,7 +7,7 @@ struct SolidSyslogAddress; void WinsockAddress_Initialise(struct SolidSyslogAddress* base) { struct SolidSyslogWinsockAddress* self = (struct SolidSyslogWinsockAddress*) base; - memset(&self->Sockaddr, 0, sizeof(self->Sockaddr)); + (void) memset(&self->Sockaddr, 0, sizeof(self->Sockaddr)); } void WinsockAddress_Cleanup(struct SolidSyslogAddress* base) diff --git a/Platform/Windows/Source/SolidSyslogWinsockAddressStatic.c b/Platform/Windows/Source/SolidSyslogWinsockAddressStatic.c index 862d6939..f158896f 100644 --- a/Platform/Windows/Source/SolidSyslogWinsockAddressStatic.c +++ b/Platform/Windows/Source/SolidSyslogWinsockAddressStatic.c @@ -17,21 +17,21 @@ static inline size_t WinsockAddress_IndexFromHandle(const struct SolidSyslogAddr static inline void WinsockAddress_CleanupAtIndex(size_t index, void* context); static bool WinsockAddress_InUse[SOLIDSYSLOG_ADDRESS_POOL_SIZE]; -static struct SolidSyslogWinsockAddress WinsockAddress_Pool[SOLIDSYSLOG_ADDRESS_POOL_SIZE]; static struct SolidSyslogPoolAllocator WinsockAddress_Allocator = {WinsockAddress_InUse, SOLIDSYSLOG_ADDRESS_POOL_SIZE}; -/* TU-private fallback returned when the pool is exhausted. Sized as a real - * SolidSyslogWinsockAddress so a Resolver overwrite at the exhausted-fallback - * call site is bounded — same sockaddr_in storage as any pooled slot. Not - * a per-Sender slot: multi-overflow integrators share this storage and - * race on it. Bumping SOLIDSYSLOG_ADDRESS_POOL_SIZE removes the race. */ -static struct SolidSyslogWinsockAddress WinsockAddress_Fallback; - struct SolidSyslogAddress* SolidSyslogWinsockAddress_Create(void) { + /* TU-private fallback returned when the pool is exhausted. Sized as + * a real SolidSyslogWinsockAddress so a Resolver overwrite at the + * exhausted-fallback call site is bounded — same sockaddr_in storage + * as any pooled slot. Not a per-Sender slot: multi-overflow integrators + * share this storage and race on it. Bumping SOLIDSYSLOG_ADDRESS_POOL_SIZE + * removes the race. */ + static struct SolidSyslogWinsockAddress fallback; + size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&WinsockAddress_Allocator); - struct SolidSyslogAddress* handle = (struct SolidSyslogAddress*) &WinsockAddress_Fallback; - if (SolidSyslogPoolAllocator_IndexIsValid(&WinsockAddress_Allocator, index)) + struct SolidSyslogAddress* handle = (struct SolidSyslogAddress*) &fallback; + if (SolidSyslogPoolAllocator_IndexIsValid(&WinsockAddress_Allocator, index) == true) { handle = WinsockAddress_HandleFromIndex(index); WinsockAddress_Initialise(handle); @@ -45,7 +45,8 @@ struct SolidSyslogAddress* SolidSyslogWinsockAddress_Create(void) static inline struct SolidSyslogAddress* WinsockAddress_HandleFromIndex(size_t index) { - return (struct SolidSyslogAddress*) &WinsockAddress_Pool[index]; + static struct SolidSyslogWinsockAddress pool[SOLIDSYSLOG_ADDRESS_POOL_SIZE]; + return (struct SolidSyslogAddress*) &pool[index]; } void SolidSyslogWinsockAddress_Destroy(struct SolidSyslogAddress* base) diff --git a/Platform/Windows/Source/SolidSyslogWinsockDatagramStatic.c b/Platform/Windows/Source/SolidSyslogWinsockDatagramStatic.c index 2428a1f1..4c2bdc8f 100644 --- a/Platform/Windows/Source/SolidSyslogWinsockDatagramStatic.c +++ b/Platform/Windows/Source/SolidSyslogWinsockDatagramStatic.c @@ -27,7 +27,7 @@ struct SolidSyslogDatagram* SolidSyslogWinsockDatagram_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&WinsockDatagram_Allocator); struct SolidSyslogDatagram* handle = SolidSyslogNullDatagram_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&WinsockDatagram_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&WinsockDatagram_Allocator, index) == true) { WinsockDatagram_Initialise(&WinsockDatagram_Pool[index].Base); handle = &WinsockDatagram_Pool[index].Base; diff --git a/Platform/Windows/Source/SolidSyslogWinsockResolverStatic.c b/Platform/Windows/Source/SolidSyslogWinsockResolverStatic.c index 3d736f33..43aaea1c 100644 --- a/Platform/Windows/Source/SolidSyslogWinsockResolverStatic.c +++ b/Platform/Windows/Source/SolidSyslogWinsockResolverStatic.c @@ -27,7 +27,7 @@ struct SolidSyslogResolver* SolidSyslogWinsockResolver_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&WinsockResolver_Allocator); struct SolidSyslogResolver* handle = SolidSyslogNullResolver_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&WinsockResolver_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&WinsockResolver_Allocator, index) == true) { WinsockResolver_Initialise(&WinsockResolver_Pool[index].Base); handle = &WinsockResolver_Pool[index].Base; diff --git a/Platform/Windows/Source/SolidSyslogWinsockTcpStreamStatic.c b/Platform/Windows/Source/SolidSyslogWinsockTcpStreamStatic.c index e4c1ba06..df4bd7a0 100644 --- a/Platform/Windows/Source/SolidSyslogWinsockTcpStreamStatic.c +++ b/Platform/Windows/Source/SolidSyslogWinsockTcpStreamStatic.c @@ -27,7 +27,7 @@ struct SolidSyslogStream* SolidSyslogWinsockTcpStream_Create(void) { size_t index = SolidSyslogPoolAllocator_AcquireFirstFree(&WinsockTcpStream_Allocator); struct SolidSyslogStream* handle = SolidSyslogNullStream_Get(); - if (SolidSyslogPoolAllocator_IndexIsValid(&WinsockTcpStream_Allocator, index)) + if (SolidSyslogPoolAllocator_IndexIsValid(&WinsockTcpStream_Allocator, index) == true) { WinsockTcpStream_Initialise(&WinsockTcpStream_Pool[index].Base); handle = &WinsockTcpStream_Pool[index].Base; diff --git a/misra_suppressions.txt b/misra_suppressions.txt index 4ab5f511..3d653bb2 100644 --- a/misra_suppressions.txt +++ b/misra_suppressions.txt @@ -12,12 +12,15 @@ # D.002 — Rules 11.2 / 11.3 / 11.5: vtable downcasts + Formatter # See docs/misra-deviations.md#d002 misra-c2012-11.2:Core/Interface/SolidSyslogFormatter.h:30 -misra-c2012-11.2:Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressPrivate.h:19 -misra-c2012-11.2:Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressPrivate.h:26 -misra-c2012-11.2:Platform/Posix/Source/SolidSyslogPosixAddressPrivate.h:17 -misra-c2012-11.2:Platform/Posix/Source/SolidSyslogPosixAddressPrivate.h:23 -misra-c2012-11.2:Platform/Windows/Source/SolidSyslogWinsockAddressPrivate.h:19 -misra-c2012-11.2:Platform/Windows/Source/SolidSyslogWinsockAddressPrivate.h:26 +misra-c2012-11.2:Platform/FreeRtos/Source/SolidSyslogFreeRtosAddress.c:9 +misra-c2012-11.2:Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressPrivate.h:20 +misra-c2012-11.2:Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressPrivate.h:28 +misra-c2012-11.2:Platform/Posix/Source/SolidSyslogPosixAddress.c:10 +misra-c2012-11.2:Platform/Posix/Source/SolidSyslogPosixAddressPrivate.h:20 +misra-c2012-11.2:Platform/Posix/Source/SolidSyslogPosixAddressPrivate.h:26 +misra-c2012-11.2:Platform/Windows/Source/SolidSyslogWinsockAddress.c:9 +misra-c2012-11.2:Platform/Windows/Source/SolidSyslogWinsockAddressPrivate.h:20 +misra-c2012-11.2:Platform/Windows/Source/SolidSyslogWinsockAddressPrivate.h:28 misra-c2012-11.3:Core/Interface/SolidSyslogFormatter.h:30 misra-c2012-11.3:Core/Source/SolidSyslogBlockStore.c:69 misra-c2012-11.3:Core/Source/SolidSyslogCircularBuffer.c:87 @@ -30,42 +33,42 @@ misra-c2012-11.3:Core/Source/SolidSyslogStreamSender.c:147 misra-c2012-11.3:Core/Source/SolidSyslogSwitchingSender.c:59 misra-c2012-11.3:Core/Source/SolidSyslogTimeQualitySd.c:59 misra-c2012-11.3:Core/Source/SolidSyslogUdpSender.c:97 -misra-c2012-11.3:Platform/Atomics/Source/SolidSyslogStdAtomicCounter.c:36 -misra-c2012-11.3:Platform/FatFs/Source/SolidSyslogFatFsFile.c:53 -misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosAddress.c:8 +misra-c2012-11.3:Platform/Atomics/Source/SolidSyslogStdAtomicCounter.c:24 +misra-c2012-11.3:Platform/FatFs/Source/SolidSyslogFatFsFile.c:45 +misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosAddress.c:9 misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressPrivate.h:20 -misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressPrivate.h:27 -misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressStatic.c:34 -misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressStatic.c:60 -misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosDatagram.c:62 -misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosMutex.c:52 +misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressPrivate.h:28 +misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressStatic.c:36 +misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosAddressStatic.c:52 +misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosDatagram.c:47 +misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosMutex.c:40 misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosResolver.c:44 -misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosTcpStream.c:112 -misra-c2012-11.3:Platform/OpenSsl/Source/SolidSyslogTlsStream.c:85 -misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixAddress.c:8 -misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixAddressPrivate.h:18 -misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixAddressPrivate.h:24 +misra-c2012-11.3:Platform/FreeRtos/Source/SolidSyslogFreeRtosTcpStream.c:85 +misra-c2012-11.3:Platform/OpenSsl/Source/SolidSyslogTlsStream.c:70 +misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixAddress.c:10 +misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixAddressPrivate.h:20 +misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixAddressPrivate.h:26 misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixAddressStatic.c:33 -misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixAddressStatic.c:60 -misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixDatagram.c:77 +misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixAddressStatic.c:49 +misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixDatagram.c:55 misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixFile.c:66 misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixMessageQueueBuffer.c:99 misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixMutex.c:47 -misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixTcpStream.c:88 -misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWinsockAddress.c:8 +misra-c2012-11.3:Platform/Posix/Source/SolidSyslogPosixTcpStream.c:75 +misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWinsockAddress.c:9 misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWinsockAddressPrivate.h:20 -misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWinsockAddressPrivate.h:27 +misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWinsockAddressPrivate.h:28 misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWinsockAddressStatic.c:33 -misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWinsockAddressStatic.c:60 -misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWindowsAtomicCounter.c:40 +misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWinsockAddressStatic.c:49 +misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWindowsAtomicCounter.c:28 misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWindowsFile.c:73 misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWindowsMutex.c:34 -misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWinsockDatagram.c:116 -misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWinsockTcpStream.c:168 +misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWinsockDatagram.c:94 +misra-c2012-11.3:Platform/Windows/Source/SolidSyslogWinsockTcpStream.c:160 misra-c2012-11.5:Core/Source/SolidSyslogUdpSender.c:201 misra-c2012-11.5:Platform/Windows/Source/SolidSyslogWinsockDatagram.c:138 -misra-c2012-11.5:Platform/Windows/Source/SolidSyslogWinsockTcpStream.c:312 -misra-c2012-11.5:Platform/Windows/Source/SolidSyslogWinsockTcpStream.c:332 +misra-c2012-11.5:Platform/Windows/Source/SolidSyslogWinsockTcpStream.c:322 +misra-c2012-11.5:Platform/Windows/Source/SolidSyslogWinsockTcpStream.c:342 # D.003 — Rule 5.7: repeating struct tags (no-typedef-struct convention) # See docs/misra-deviations.md#d003 @@ -89,23 +92,15 @@ misra-c2012-5.7:Core/Source/SolidSyslogFileBlockDevice.c:16 misra-c2012-5.7:Core/Source/SolidSyslogFileBlockDevice.c:23 misra-c2012-5.7:Core/Source/SolidSyslogOriginSdPrivate.h:9 misra-c2012-5.7:Platform/FreeRtos/Source/SolidSyslogFreeRtosSysUpTime.c:7 -misra-c2012-5.7:Platform/FreeRtos/Source/SolidSyslogFreeRtosTcpStream.c:45 -misra-c2012-5.7:Platform/OpenSsl/Source/SolidSyslogTlsStream.c:16 -misra-c2012-5.7:Platform/Posix/Source/SolidSyslogGetAddrInfoResolver.c:20 -misra-c2012-5.7:Platform/Posix/Source/SolidSyslogPosixDatagram.c:21 misra-c2012-5.7:Platform/Posix/Source/SolidSyslogPosixFile.c:18 misra-c2012-5.7:Platform/Posix/Source/SolidSyslogPosixHostname.c:10 misra-c2012-5.7:Platform/Posix/Source/SolidSyslogPosixMessageQueueBuffer.c:17 misra-c2012-5.7:Platform/Posix/Source/SolidSyslogPosixMessageQueueBufferPrivate.h:11 -misra-c2012-5.7:Platform/Posix/Source/SolidSyslogPosixSleep.c:6 misra-c2012-5.7:Platform/Posix/Source/SolidSyslogPosixSysUpTime.c:6 -misra-c2012-5.7:Platform/Posix/Source/SolidSyslogPosixTcpStream.c:24 misra-c2012-5.7:Platform/Windows/Source/SolidSyslogWindowsClock.c:21 misra-c2012-5.7:Platform/Windows/Source/SolidSyslogWindowsFile.c:24 misra-c2012-5.7:Platform/Windows/Source/SolidSyslogWindowsHostname.c:19 misra-c2012-5.7:Platform/Windows/Source/SolidSyslogWindowsSysUpTime.c:18 -misra-c2012-5.7:Platform/Windows/Source/SolidSyslogWinsockResolver.c:37 -misra-c2012-5.7:Platform/Windows/Source/SolidSyslogWinsockTcpStream.c:100 # D.004 — Rule 18.4: pointer arithmetic on record buffers # See docs/misra-deviations.md#d004 @@ -149,12 +144,25 @@ misra-c2012-2.4:Core/Source/BlockSequence.c:13 misra-c2012-2.4:Core/Source/BlockSequence.c:107 misra-c2012-2.4:Core/Source/RecordStore.c:14 misra-c2012-2.4:Core/Source/SolidSyslogStreamSender.c:19 +# 2.4 anonymous-enum site that surfaced after S10.17 narrowed the +# FreeRtos transport timing-constant scope; UdpPayload.h:15 had a 5.7 +# suppression from S10.16 but the 2.4 was masked by cppcheck dedup. +misra-c2012-2.4:Core/Interface/SolidSyslogUdpPayload.h:15 # 5.7 anonymous-enum sites — migrated from the D.003 block as per-group # stories review their cluster. Historical sites still under D.003 will -# move here as S10.17 / S10.18 / S10.19 land. +# move here as S10.18 / S10.19 land. misra-c2012-5.7:Core/Interface/SolidSyslogUdpPayload.h:15 misra-c2012-5.7:Core/Source/SolidSyslogStreamSender.c:19 misra-c2012-5.7:Core/Source/SolidSyslogUdpPayload.c:5 +misra-c2012-5.7:Platform/FreeRtos/Source/SolidSyslogFreeRtosResolver.c:21 +misra-c2012-5.7:Platform/FreeRtos/Source/SolidSyslogFreeRtosTcpStream.c:27 +misra-c2012-5.7:Platform/OpenSsl/Source/SolidSyslogTlsStream.c:16 +misra-c2012-5.7:Platform/Posix/Source/SolidSyslogGetAddrInfoResolver.c:20 +misra-c2012-5.7:Platform/Posix/Source/SolidSyslogPosixDatagram.c:21 +misra-c2012-5.7:Platform/Posix/Source/SolidSyslogPosixSleep.c:6 +misra-c2012-5.7:Platform/Posix/Source/SolidSyslogPosixTcpStream.c:24 +misra-c2012-5.7:Platform/Windows/Source/SolidSyslogWinsockResolver.c:37 +misra-c2012-5.7:Platform/Windows/Source/SolidSyslogWinsockTcpStream.c:100 # D.010 — Rule 20.10: # stringification in _Static_assert polyfill # See docs/misra-deviations.md#d010