Files
firmware/suppressions.txt
Ben Meadors 784014e8a7 fix(ci): unbreak the ESP32 static analysis gate after the cppcheck 2.20 jump (#11777)
Every PR targeting develop has been red since 2026-09-07 on the seven ESP32
check jobs, while the nRF52, RP2040 and STM32 jobs pass on identical source.

gh-action-firmware#61 moved the ESP32 container images onto the pioarduino
core. Its esp32 platform ships its own tool-cppcheck 2.20.1 and reinstalls it
over anything the repo pins, so ESP32 now analyses with cppcheck 2.20 while
every other platform still resolves platformio/tool-cppcheck 1.21100.230717,
i.e. 2.11. 2.20 parses far more of this tree than 2.11 ever managed, so checks
that were always enabled fired for the first time: 388 defects, ESP32 only.

#11776 cleared the two unknownMacro errors. Of the 386 left, two are worth
acting on and are fixed rather than suppressed:

  * SerialModule dereferenced a null Position in NMEA/CALTOPO mode. `decoded`
    stays NULL when pb_decode_from_bytes() fails, but printWPL() was called
    with *decoded regardless, so a malformed position payload on our portnum
    crashed the node. Emit the waypoint only on a successful decode.
  * InkHUD's 12-hour clock passed a signed 12 to a %u conversion.

The rest are style and performance suggestions - functionStatic and the
const-correctness family account for 351 of them. Suppress those check ids so
the gate means the same thing on every platform again, scoping the one-off
ones to their file so a new occurrence elsewhere still fails. Burning them
down is worth doing deliberately, not under a CI outage.

Verified in the CI container images: all seven previously failing ESP32
environments pass, and rak4631, tracker-t1000-e and t-echo-plus still pass
under cppcheck 2.11.
2026-09-08 23:52:54 +00:00

103 lines
3.2 KiB
Plaintext

// cppcheck suppressions
assertWithSideEffect
// TODO: need to come back to these
duplInheritedMember
// TODO:
// "Using memset() on struct which contains a floating point number."
// tried:
// if (std::is_floating_point<T>::value) {
// p = 0;
// in src/mesh/MemoryPool.h
memsetClassFloat
knownConditionTrueFalse
// no real downside/harm in these
unusedFunction
unusedPrivateFunction
// most likely due to a cppcheck configuration issue (like missing an include)
syntaxError
// try to quiet a few
//useInitializationList:src/main.cpp
useInitializationList
//unreadVariable:src/graphics/Screen.cpp
unreadVariable
// I don't want to go back and cast function pointers just to appease a tools insatiable thirst for immutability
constParameterCallback
redundantInitialization
//cstyleCast:src/mesh/MemoryPool.h:71
cstyleCast
// ignore stuff that is not ours
*:.pio/*
*:*/libdeps/*
*:*/generated/*
// emscripten-only wasm node: EM_ASYNC_JS/EM_JS expand to constructs cppcheck
// can't parse (internalAstError), and these sources are not part of any checked
// board build ([env:native-wasm] is board_level=extra, compiled by the build-wasm
// CI job, not pio check). Don't analyze them here.
*:*/platform/portduino/wasm/*
noExplicitConstructor:*/mqtt/*
postfixOperator:*/mqtt/*
// these two caused issues
missingOverride
virtualCallInConstructor
internalAstError:*/CrossPlatformCryptoEngine.cpp
uninitMemberVar:*/AudioThread.h
// False positive: make_zeroizing_array() returns unique_ptr<uint8_t[], ...>, so
// .get() is uint8_t*, not void*. cppcheck can't resolve the custom-deleter alias
// and reports arithmetic on these buffers as void* pointer math.
arithOperationsOnVoidPointer:*/EncryptedStorage.cpp
useStlAlgorithm
variableScope
// cppcheck 2.20 (ESP32 only)
//
// The ESP32 CI images build on the pioarduino core, whose esp32 platform installs its own
// tool-cppcheck 2.20.1 and reinstalls it over any pinned version. Every other platform still
// resolves platformio/tool-cppcheck 1.21100.230717, i.e. cppcheck 2.11. 2.20 parses far more of
// this tree than 2.11 managed to, so checks that have always been enabled started firing for the
// first time - 388 defects on ESP32, none anywhere else, for identical source.
//
// Silence the checks that appeared with that jump so the gate means the same thing on every
// platform again. These are style and performance suggestions, not defects; burning them down is
// worth doing deliberately, not under a CI outage.
functionStatic
staticFunction
constParameterPointer
iterateByValue
returnByReference
passedByValue
uselessOverride
constVariable
constVariablePointer
constVariableReference
constParameterReference
// Single deliberate sites, scoped so a new one elsewhere still fails the gate. Router folds the
// bitfield's want_response bit into the decoded bool; Power interpolates the OCV curve in float.
bitwiseOnBoolean:*/Router.cpp
suspiciousFloatingPointCast:*/Power.cpp
// The 2.20 successor to cstyleCast, which is already suppressed above for the same reason.
dangerousTypeCast
// Sensor drivers hold a driver object they new in begin() and are constructed once, at global
// scope. cppcheck wants the rule of three on them; nothing ever copies one.
noCopyConstructor:*/Telemetry/Sensor/*
noOperatorEq:*/Telemetry/Sensor/*