Skip to content
25 changes: 24 additions & 1 deletion cpp/include/tensorrt_llm/common/stringUtils.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,28 @@ void printElement(std::ostream& os, std::tuple<Args...> const& t)
printTupleImpl(os, t, std::index_sequence_for<Args...>{});
}

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
Expand Down Expand Up @@ -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*
Expand All @@ -131,7 +155,6 @@ inline std::string fmtstr(char const* format, ...)
return str->data();
},
&result, args);
va_end(args);

return result;
}
Expand Down
2 changes: 2 additions & 0 deletions cpp/tensorrt_llm/common/stringUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down