diff --git a/cpp/include/tensorrt_llm/common/stringUtils.h b/cpp/include/tensorrt_llm/common/stringUtils.h index e806c714527..a4803cba372 100644 --- a/cpp/include/tensorrt_llm/common/stringUtils.h +++ b/cpp/include/tensorrt_llm/common/stringUtils.h @@ -74,6 +74,28 @@ void printElement(std::ostream& os, std::tuple const& t) printTupleImpl(os, t, std::index_sequence_for{}); } +class va_list_guard +{ +public: + explicit va_list_guard(va_list& args) + : mArgs(args) + { + } + + ~va_list_guard() + { + va_end(mArgs); + } + + va_list_guard(va_list_guard const&) = delete; + va_list_guard& operator=(va_list_guard const&) = delete; + va_list_guard(va_list_guard&&) = delete; + va_list_guard& operator=(va_list_guard&&) = delete; + +private: + va_list& mArgs; +}; + } // namespace // Override operator<< for any tuple @@ -117,6 +139,8 @@ inline std::string fmtstr(char const* format, ...) va_list args; va_start(args, format); + va_list_guard args_guard(args); + fmtstr_( format, [](void* target, size_t count) -> char* @@ -131,7 +155,6 @@ inline std::string fmtstr(char const* format, ...) return str->data(); }, &result, args); - va_end(args); return result; } diff --git a/cpp/tensorrt_llm/common/stringUtils.cpp b/cpp/tensorrt_llm/common/stringUtils.cpp index 75052ad4fad..283dec8842c 100644 --- a/cpp/tensorrt_llm/common/stringUtils.cpp +++ b/cpp/tensorrt_llm/common/stringUtils.cpp @@ -34,6 +34,8 @@ void fmtstr_(char const* format, fmtstr_allocator alloc, void* target, va_list a size_t constexpr init_size = 2048; char fixed_buffer[init_size]; auto const size = std::vsnprintf(fixed_buffer, init_size, format, args0); + va_end(args0); + TLLM_CHECK_WITH_INFO(size >= 0, std::string(std::strerror(errno))); if (size == 0) {