From 03f3deff41bb747b60398cf1ff9c5c8888136550 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 14 Jan 2026 15:24:42 -1000 Subject: [PATCH 1/2] [lvgl] Use stack buffer for event code formatting, document justified str_sprintf usage (#13220) Co-authored-by: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> --- esphome/components/lvgl/lv_validation.py | 1 + esphome/components/lvgl/lvgl_esphome.cpp | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/esphome/components/lvgl/lv_validation.py b/esphome/components/lvgl/lv_validation.py index 947e44b131..3c1838219c 100644 --- a/esphome/components/lvgl/lv_validation.py +++ b/esphome/components/lvgl/lv_validation.py @@ -413,6 +413,7 @@ class TextValidator(LValidator): str_args = [str(x) for x in value[CONF_ARGS]] arg_expr = cg.RawExpression(",".join(str_args)) format_str = cpp_string_escape(format_str) + # str_sprintf justified: user-defined format, can't optimize without permanent RAM cost sprintf_str = f"str_sprintf({format_str}, {arg_expr}).c_str()" if nanval := value.get(CONF_IF_NAN): nanval = cpp_string_escape(nanval) diff --git a/esphome/components/lvgl/lvgl_esphome.cpp b/esphome/components/lvgl/lvgl_esphome.cpp index 50dba94a2b..bb373abb88 100644 --- a/esphome/components/lvgl/lvgl_esphome.cpp +++ b/esphome/components/lvgl/lvgl_esphome.cpp @@ -65,7 +65,10 @@ std::string lv_event_code_name_for(uint8_t event_code) { if (event_code < sizeof(EVENT_NAMES) / sizeof(EVENT_NAMES[0])) { return EVENT_NAMES[event_code]; } - return str_sprintf("%2d", event_code); + // max 4 bytes: "%u" with uint8_t (max 255, 3 digits) + null + char buf[4]; + snprintf(buf, sizeof(buf), "%u", event_code); + return buf; } static void rounder_cb(lv_disp_drv_t *disp_drv, lv_area_t *area) { From 0ea5d7abfff2947c681b00edc98ad57fabe7613c Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 14 Jan 2026 15:27:04 -1000 Subject: [PATCH 2/2] [statsd] Use direct appends and stack buffer instead of str_sprintf --- esphome/components/statsd/statsd.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/esphome/components/statsd/statsd.cpp b/esphome/components/statsd/statsd.cpp index 7729f36858..c4b49a09a9 100644 --- a/esphome/components/statsd/statsd.cpp +++ b/esphome/components/statsd/statsd.cpp @@ -114,14 +114,23 @@ void StatsdComponent::update() { // This implies you can't explicitly set a gauge to a negative number without first setting it to zero. if (val < 0) { if (this->prefix_) { - out.append(str_sprintf("%s.", this->prefix_)); + out.append(this->prefix_); + out.append("."); } - out.append(str_sprintf("%s:0|g\n", s.name)); + out.append(s.name); + out.append(":0|g\n"); } if (this->prefix_) { - out.append(str_sprintf("%s.", this->prefix_)); + out.append(this->prefix_); + out.append("."); } - out.append(str_sprintf("%s:%f|g\n", s.name, val)); + out.append(s.name); + // Buffer for ":" + value + "|g\n". + // %g uses max 13 chars for value (sign + 6 significant digits + e+xxx) + // Total: 1 + 13 + 4 = 18 chars + null, use 24 for safety + char val_buf[24]; + snprintf(val_buf, sizeof(val_buf), ":%g|g\n", val); + out.append(val_buf); if (out.length() > SEND_THRESHOLD) { this->send_(&out);