(chores) cleanup some compiler warnings

* switch-cases that fall through
* potential buffer overflow in improv.cpp
* potentially uninitialized variables in FX.cpp
* potential array out-of-range on segment::col[]
* minor optimization: only apply gamma correction when result is needed
* tag some possibly unused variables with   [[maybe_unused]]
This commit is contained in:
Frank
2026-03-11 13:54:58 +01:00
parent b994cf5b95
commit 49130c9ec9
13 changed files with 26 additions and 23 deletions

View File

@@ -176,7 +176,7 @@ static bool limiterOn = false; // bool: enable / disable dynamic
#else
static bool limiterOn = true;
#endif
static uint8_t micQuality = 0; // affects input filtering; 0 normal, 1 minimal filtering, 2 no filtering
[[maybe_unused]] static uint8_t micQuality = 0; // input filtering; 0 normal, 1 minimal filtering, 2 no filtering - unused on 8266
#ifdef FFT_USE_SLIDING_WINDOW
static uint16_t attackTime = 24; // int: attack time in milliseconds. Default 0.024sec
static uint16_t decayTime = 250; // int: decay time in milliseconds. New default 250ms.

View File

@@ -395,6 +395,7 @@ const char **RotaryEncoderUIUsermod::re_findModeStrings(const char json[], int n
break;
case ',':
if (!insideQuotes) modeIndex++;
// falls through
default:
if (!insideQuotes) break;
}

View File

@@ -9376,9 +9376,9 @@ uint16_t mode_particlefireworks(void) {
// check each rocket's state and emit particles according to its state: moving up = emit exhaust, at top = explode; falling down = standby time
uint32_t emitparticles, frequency, baseangle, hueincrement; // number of particles to emit for each rocket's state
// variables for circular explosions
[[maybe_unused]] int32_t speed, currentspeed, speedvariation, percircle;
[[maybe_unused]] int32_t speed = 0, currentspeed, speedvariation, percircle;
int32_t counter = 0;
[[maybe_unused]] uint16_t angle;
[[maybe_unused]] uint16_t angle = 0;
[[maybe_unused]] unsigned angleincrement;
bool circularexplosion = false;

View File

@@ -693,7 +693,7 @@ typedef struct Segment {
uint8_t currentMode(uint8_t modeNew);
inline uint32_t currentColor(uint8_t slot, uint32_t colorNew) const { // WLEDMM moved here from FX_fcn.cpp
return transitional && _t ? color_blend(_t->_colorT[slot], colorNew, progress(), true) : colorNew;
return transitional && _t ? color_blend(_t->_colorT[min(slot, uint8_t(2))], colorNew, progress(), true) : colorNew; // WLEDMM prevent array bounds violation - only 3 color slots allowed
}
CRGBPalette16 &loadPalette(CRGBPalette16 &tgt, uint8_t pal) const;
@@ -728,25 +728,26 @@ typedef struct Segment {
// WLEDMM function moved here (from FX_fcn.cpp) for better optimization by the compiler
inline uint32_t __attribute__((hot)) color_from_palette(uint_fast16_t i, bool mapping, bool wrap, uint8_t mcol=0, uint8_t pbri = 255) const {
uint32_t color = gamma32(currentColor(mcol, colors[mcol]));
uint32_t color = currentColor(mcol, colors[min(mcol, uint8_t(2))]); // WLEDMM prevent array bounds violation - only 3 color slots allowed
// default palette or no RGB support on segment
if ((palette == 0 && mcol < NUM_COLORS) || !_isRGB) {
color = gamma32(color);
if (pbri == 255) return color;
return RGBW32(scale8_video(R(color),pbri), scale8_video(G(color),pbri), scale8_video(B(color),pbri), scale8_video(W(color),pbri));
else return RGBW32(scale8_video(R(color),pbri), scale8_video(G(color),pbri), scale8_video(B(color),pbri), scale8_video(W(color),pbri));
}
uint8_t paletteIndex = i;
uint_fast16_t vLen = mapping ? virtualLength() : 1;
if (mapping && vLen > 1) paletteIndex = (i*255)/(vLen -1);
if (!wrap) paletteIndex = scale8(paletteIndex, 240); //cut off blend at palette "end"
CRGB fastled_col = ColorFromPaletteWLED(_currentPalette, paletteIndex, pbri, (strip_getPaletteBlend() == 3)? NOBLEND:LINEARBLEND); // NOTE: paletteBlend should be global
uint8_t w = W(color); // extract white channel
uint8_t w = gamma8(W(color)); // extract white channel
return RGBW32(fastled_col.r, fastled_col.g, fastled_col.b, w);
}
// WLEDMM function moved here (from FX_fcn.cpp) for better optimization by the compiler
inline uint32_t color_wheel(uint8_t pos) const {
if (palette) return color_from_palette(pos, false, true, 0);
uint8_t w = W(currentColor(0, colors[0])); // extract white channel
uint8_t w = gamma8(W(currentColor(0, colors[0]))); // extract white channel
pos = 255 - pos;
if (pos < 85) {
return RGBW32((255 - pos * 3), 0, (pos * 3), w);

View File

@@ -247,7 +247,7 @@ void Segment::startFrame(void) {
void IRAM_ATTR __attribute__((hot)) Segment::setPixelColorXY_fast(int x, int y, uint32_t col, uint32_t scaled_col, int cols, int rows) const //WLEDMM
{
unsigned i = UINT_MAX;
bool sameColor = false;
[[maybe_unused]] bool sameColor = false;
if (ledsrgb) { // WLEDMM small optimization
i = x + y*cols; // avoid error checking done by XY() - be optimistic about ranges of x and y
CRGB fastled_col = CRGB(col);
@@ -304,7 +304,7 @@ void IRAM_ATTR_YN Segment::setPixelColorXY(int x, int y, uint32_t col) //WLEDMM:
if (x<0 || y<0 || x >= cols || y >= rows) return; // if pixel would fall out of virtual segment just exit
unsigned i = UINT_MAX;
bool sameColor = false;
[[maybe_unused]] bool sameColor = false;
if (ledsrgb) { // WLEDMM small optimization
i = XY(x,y);
CRGB fastled_col = CRGB(col);
@@ -914,7 +914,7 @@ void Segment::drawText(const unsigned char* text, size_t maxLen, int16_t x, int1
size_t textLength = min(strnlen((char*)text, maxLen), numberOfChars);
#endif
// pass characters to drawCharacter()
for (int i = 0; i < textLength; i++) {
for (size_t i = 0; i < textLength; i++) {
SEGMENT.drawCharacter((unsigned char) decoded_text[i], x + w*i, y, w, h, color, col2, drawShadow);
}
}

View File

@@ -173,8 +173,8 @@ Segment& Segment::operator= (const Segment &orig) {
transitional = false; // copied segment cannot be in transition
if (name) delete[] name;
if (_t) delete _t;
CRGB* oldLeds = ledsrgb;
size_t oldLedsSize = ledsrgbSize;
// [[maybe_unused]] CRGB* oldLeds = ledsrgb;
// [[maybe_unused]] size_t oldLedsSize = ledsrgbSize;
if (ledsrgb && !Segment::_globalLeds) d_free(ledsrgb);
deallocateData();
// copy source

View File

@@ -1470,7 +1470,7 @@ void ParticleSystem1D::render() {
// add background color
uint32_t bg_color = SEGCOLOR(1);
if (bg_color > 0) { //if not black
CRGB bg_color_crgb = bg_color; // convert to CRGB
[[maybe_unused]] CRGB bg_color_crgb = bg_color; // convert to CRGB
for (int32_t i = 0; i <= maxXpixel; i++) {
#ifdef ESP8266 // no local buffer on ESP8266
SEGMENT.addPixelColor(i, bg_color, true);

View File

@@ -13,7 +13,7 @@ static byte e131LastSequenceNumber[E131_MAX_UNIVERSE_COUNT] = {0}; // to detect
//handles RGB data only
void handleDDPPacket(e131_packet_t* p) {
static bool ddpSeenPush = false; // have we seen a push yet?
int lastPushSeq = e131LastSequenceNumber[0];
[[maybe_unused]] int lastPushSeq = e131LastSequenceNumber[0];
//reject late packets belonging to previous frame (assuming 4 packets max. before push)
#if 0 // WLEDMM fixme - we definitely have more than 5-10 packets per frame !!!
@@ -32,7 +32,7 @@ void handleDDPPacket(e131_packet_t* p) {
uint8_t ddpChannelsPerLed = ((p->dataType & 0b00111000)>>3 == 0b011) ? 4 : 3; // data type 0x1B (formerly 0x1A) is RGBW (type 3, 8 bit/channel)
// WLEDMM for debugging
static unsigned lastPush = millis();
[[maybe_unused]] static unsigned lastPush = millis();
static unsigned packets = 0;
static unsigned pixels = 0;

View File

@@ -208,8 +208,8 @@ void sendImprovInfoResponse() {
#endif
//Use serverDescription if it has been changed from the default "WLED", else mDNS name
bool useMdnsName = (strcmp(serverDescription, "WLED") == 0 && strlen(cmDNS) > 0);
char vString[32] = { '\0' };
sprintf_P(vString, PSTR("%s/%i"), versionString, VERSION);
char vString[48] = { '\0' };
snprintf_P(vString, 47, PSTR("%s/%i"), versionString, VERSION);
const char *str[4] = {"WLED", vString, bString, useMdnsName ? cmDNS : serverDescription};
sendImprovRPCResult(ImprovRPCType::Request_Info, 4, str);

View File

@@ -45,7 +45,7 @@ void applyValuesToSelectedSegs()
auto pre_mode = selsegRef.mode;
auto pre_col0 = selsegRef.colors[0];
auto pre_col1 = selsegRef.colors[1];
auto pre_col2 = selsegRef.colors[2];
// [[maybe_unused]] auto pre_col2 = selsegRef.colors[2];
for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) {
Segment& seg = strip.getSegment(i);

View File

@@ -316,11 +316,12 @@ uint8_t extractModeName(uint8_t mode, const char *src, char *dest, uint8_t maxLe
case '"':
insideQuotes = !insideQuotes;
break;
case '[':
case '[': // falls through
case ']':
break;
case ',':
if (!insideQuotes) qComma++;
// falls through
default:
if (!insideQuotes || (qComma != mode)) break;
dest[printedChars++] = singleJsonSymbol;

View File

@@ -1351,8 +1351,8 @@ void WLED::handleConnection()
return;
}
static unsigned retryCount1 = 0; // WLEDMM
static unsigned retryCount = 0; // WLEDMM
[[maybe_unused]] static unsigned retryCount1 = 0; // WLEDMM
#ifdef ARDUINO_ARCH_ESP32
// reconnect WiFi to clear stale allocations if heap gets too low
if ((now - heapTime > 5000) && !strip.isUpdating()) { // WLEDMM: updated with better logic for small heap available by block, not total. // WLEDMM trying to use a moment when the strip is idle
@@ -1510,7 +1510,7 @@ void WLED::handleConnection()
void WLED::handleStatusLED()
{
#if defined(STATUSLED)
uint32_t c = 0;
[[maybe_unused]] uint32_t c = 0;
#if STATUSLED>=0
if (pinManager.isPinAllocated(STATUSLED)) {

View File

@@ -290,7 +290,7 @@ static bool sendLiveLedsWs(uint32_t wsClient) // WLEDMM added "static"
#endif
(void) unGamma8(127); // WLEDMM dummy call, just to make sure that gammaTinv is initialized, so we can use fast_unGamma8
uint8_t stripBrightness = strip.getBrightness();
// [[maybe_unused]] uint8_t stripBrightness = strip.getBrightness();
for (size_t i = 0; pos < bufSize -2; i += n)
{
//WLEDMM skipping lines done right