Hi Heiko,

On 2/25/25 10:49 AM, Heiko Schocher wrote:
Tom reported the following covervity scan error:

*** CID 542488:  Control flow issues  (NO_EFFECT)
/drivers/led/led-uclass.c: 277 in led_get_function_name()
271                     return uc_plat->label;
272
273             /* Now try to detect function label name */
274             func = dev_read_string(dev, "function");
275             cp = dev_read_u32(dev, "color", &color);
276             // prevent coverity scan error CID 541279: (TAINTED_SCALAR)
     CID 542488:  Control flow issues  (NO_EFFECT)
     This less-than-zero comparison of an unsigned value is never true.
"color < 0U".
277             if (color < LED_COLOR_ID_WHITE || color >= LED_COLOR_ID_MAX)
278                     cp = -EINVAL;
279

see:
https://lists.denx.de/pipermail/u-boot/2025-February/581567.html

Fix it.

Signed-off-by: Heiko Schocher <h...@denx.de>

---
Azure build:
https://dev.azure.com/hs0298/hs/_build/results?buildId=171&view=results

  drivers/led/led-uclass.c                       | 2 +-
  dts/upstream/include/dt-bindings/leds/common.h | 5 ++++-

NACK. We don't modify files in dts/upstream as they are directly imported from devicetree-rebasing tree and would either be replaced during next update or induce a merge conflict.

  2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c
index 22f61d12d38..e2edcc43f30 100644
--- a/drivers/led/led-uclass.c
+++ b/drivers/led/led-uclass.c
@@ -274,7 +274,7 @@ static const char *led_get_function_name(struct udevice 
*dev)
        func = dev_read_string(dev, "function");
        cp = dev_read_u32(dev, "color", &color);
        // prevent coverity scan error CID 541279: (TAINTED_SCALAR)
-       if (color < LED_COLOR_ID_WHITE || color >= LED_COLOR_ID_MAX)
+       if (color >= LED_COLOR_ID_MAX)
                cp = -EINVAL;
if (cp == 0 || func) {
diff --git a/dts/upstream/include/dt-bindings/leds/common.h 
b/dts/upstream/include/dt-bindings/leds/common.h
index 4f017bea012..9e5ac5196e2 100644
--- a/dts/upstream/include/dt-bindings/leds/common.h
+++ b/dts/upstream/include/dt-bindings/leds/common.h
@@ -21,7 +21,10 @@
  #define LEDS_BOOST_ADAPTIVE   1
  #define LEDS_BOOST_FIXED      2
-/* Standard LED colors */
+/*
+ * Standard LED colors, LED_COLOR_ID_WHITE must be the
+ * first one and start with value 0
+ */

Can you explain why white needs to be the first AND be 0?

I don't know enough about the C standard or compilers in general to know what happens if the indices in led_colors aren't in order but I guess that's where your limitation comes from?

e.g.

  static const char * const led_colors[LED_COLOR_ID_MAX] = {
          [LED_COLOR_ID_WHITE] = "white",
          [LED_COLOR_ID_RED] = "red",
          [LED_COLOR_ID_GREEN] = "green",
          [LED_COLOR_ID_BLUE] = "blue",
          [LED_COLOR_ID_AMBER] = "amber",
          [LED_COLOR_ID_VIOLET] = "violet",
          [LED_COLOR_ID_YELLOW] = "yellow",
          [LED_COLOR_ID_IR] = "ir",
          [LED_COLOR_ID_MULTI] = "multicolor",
          [LED_COLOR_ID_RGB] = "rgb",
          [LED_COLOR_ID_PURPLE] = "purple",
          [LED_COLOR_ID_ORANGE] = "orange",
          [LED_COLOR_ID_PINK] = "pink",
          [LED_COLOR_ID_CYAN] = "cyan",
          [LED_COLOR_ID_LIME] = "lime",
  };

is ordered, but what happens if you have e.g.:

  static const char * const led_colors[LED_COLOR_ID_MAX] = {
          [LED_COLOR_ID_RED] = "red",
          [LED_COLOR_ID_WHITE] = "white",
          [LED_COLOR_ID_GREEN] = "green",
          [LED_COLOR_ID_BLUE] = "blue",
          [LED_COLOR_ID_AMBER] = "amber",
          [LED_COLOR_ID_VIOLET] = "violet",
          [LED_COLOR_ID_YELLOW] = "yellow",
          [LED_COLOR_ID_IR] = "ir",
          [LED_COLOR_ID_MULTI] = "multicolor",
          [LED_COLOR_ID_RGB] = "rgb",
          [LED_COLOR_ID_PURPLE] = "purple",
          [LED_COLOR_ID_ORANGE] = "orange",
          [LED_COLOR_ID_PINK] = "pink",
          [LED_COLOR_ID_CYAN] = "cyan",
          [LED_COLOR_ID_LIME] = "lime",
  };

? I think it should be just fine?

Reading the code, it seems there's an assumption that led_colors has a contiguous and full list of indices from LED_COLOR_ID "enum". What happens when the dt-binding gets extended with new colors and the DT makes use of it without updating led_colors in led-uclass.c? Aren't we going to try to print a NULL string?

If that's the case, I see two solutions:
- ignore LED colors when they aren't in led_colors,
- decouple LED_COLOR_ID_MAX from the binding with UBOOT_LED_COLOR_ID_MAX which is the currently supported max based on led_colors last index (+1). We could even do a #warn or #error so that UBOOT_LED_COLOR_ID_MAX and LED_COLOR_ID_MAX are the same value so that we're forced to keep them in sync, but that'll make Tom's life harder when merging newer releases of devicetree-rebasing tree.

Cheers,
Quentin

Reply via email to