From 6ca1b907520309e282a9b4eea4046b4c31c1b247 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 28 Jan 2026 18:14:03 -1000 Subject: [PATCH] Address Copilot review feedback - Fix regex to actually match std::to_string() by using alternation (the : in the lookbehind was preventing matches) - Update error message to mention both std::to_string() and unqualified to_string() forms - Correct buffer sizes for signed integer types: - int8_t: 5 chars (not 4) for "-128\0" - int16_t: 7 chars (not 6) for "-32768\0" - int32_t: 12 chars (not 11) for "-2147483648\0" --- script/ci-custom.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/script/ci-custom.py b/script/ci-custom.py index d436c25b600..864279cab8d 100755 --- a/script/ci-custom.py +++ b/script/ci-custom.py @@ -759,12 +759,13 @@ def lint_no_sprintf(fname, match): @lint_re_check( # Match std::to_string() or unqualified to_string() calls # The esphome namespace has "using std::to_string;" so unqualified calls resolve to std::to_string - # Use negative lookbehind to avoid matching: + # Use negative lookbehind for unqualified calls to avoid matching: # - Function definitions: "const char *to_string(" or "std::string to_string(" # - Method definitions: "Class::to_string(" # - Method calls: ".to_string(" or "->to_string(" # - Other identifiers: "_to_string(" - r"(?:])to_string\s*\(" + CPP_RE_EOL, + # Also explicitly match std::to_string since : is in the lookbehind + r"(?:(?:])to_string|std\s*::\s*to_string)\s*\(" + CPP_RE_EOL, include=cpp_include, exclude=[ # Vendored library @@ -779,15 +780,20 @@ def lint_no_sprintf(fname, match): ) def lint_no_std_to_string(fname, match): return ( - f"{highlight('std::to_string()')} allocates heap memory. On long-running embedded " - f"devices, repeated heap allocations fragment memory over time.\n" + f"{highlight('std::to_string()')} (including unqualified {highlight('to_string()')}) " + f"allocates heap memory. On long-running embedded devices, repeated heap allocations " + f"fragment memory over time.\n" f"Please use {highlight('snprintf()')} with a stack buffer instead.\n" f"\n" - f"Buffer sizes and format specifiers:\n" - f" uint8_t/int8_t: 4 chars - %u / %d (or PRIu8/PRId8)\n" - f" uint16_t/int16_t: 6 chars - %u / %d (or PRIu16/PRId16)\n" - f" uint32_t/int32_t: 11 chars - %" + "PRIu32 / %" + "PRId32\n" - " uint64_t/int64_t: 21 chars - %" + "PRIu64 / %" + "PRId64\n" + f"Buffer sizes and format specifiers (sizes include sign and null terminator):\n" + f" uint8_t: 4 chars - %u (or PRIu8)\n" + f" int8_t: 5 chars - %d (or PRId8)\n" + f" uint16_t: 6 chars - %u (or PRIu16)\n" + f" int16_t: 7 chars - %d (or PRId16)\n" + f" uint32_t: 11 chars - %" + "PRIu32\n" + " int32_t: 12 chars - %" + "PRId32\n" + " uint64_t: 21 chars - %" + "PRIu64\n" + " int64_t: 21 chars - %" + "PRId64\n" f" float/double: 24 chars - %.8g (15 digits + sign + decimal + e+XXX)\n" f" 317 chars - %f (for DBL_MAX: 309 int digits + decimal + 6 frac + sign)\n" f"\n"