From a7fbecb25c03c2584acfd85d56504db253106681 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 26 Jan 2026 17:28:07 -1000 Subject: [PATCH] [ci] Soft-deprecate str_sprintf/str_snprintf to prevent hidden heap allocations (#13227) --- esphome/core/helpers.h | 2 ++ script/ci-custom.py | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/esphome/core/helpers.h b/esphome/core/helpers.h index 1aa29fa3f7..81397668e8 100644 --- a/esphome/core/helpers.h +++ b/esphome/core/helpers.h @@ -655,9 +655,11 @@ inline uint32_t fnv1_hash_object_id(const char *str, size_t len) { } /// snprintf-like function returning std::string of maximum length \p len (excluding null terminator). +/// @warning Allocates heap memory. Use snprintf() with a stack buffer instead. std::string __attribute__((format(printf, 1, 3))) str_snprintf(const char *fmt, size_t len, ...); /// sprintf-like function returning std::string. +/// @warning Allocates heap memory. Use snprintf() with a stack buffer instead. std::string __attribute__((format(printf, 1, 2))) str_sprintf(const char *fmt, ...); #ifdef USE_ESP8266 diff --git a/script/ci-custom.py b/script/ci-custom.py index 01e197057a..b146c9867e 100755 --- a/script/ci-custom.py +++ b/script/ci-custom.py @@ -692,6 +692,8 @@ HEAP_ALLOCATING_HELPERS = { "str_truncate": "removal (function is unused)", "str_upper_case": "removal (function is unused)", "str_snake_case": "removal (function is unused)", + "str_sprintf": "snprintf() with a stack buffer", + "str_snprintf": "snprintf() with a stack buffer", } @@ -710,7 +712,9 @@ HEAP_ALLOCATING_HELPERS = { r"str_sanitize(?!_)|" r"str_truncate|" r"str_upper_case|" - r"str_snake_case" + r"str_snake_case|" + r"str_sprintf|" + r"str_snprintf" r")\s*\(" + CPP_RE_EOL, include=cpp_include, exclude=[