Compare commits

...

1 Commits

Author SHA1 Message Date
Pratik Mankawde
547b7c4e04 fixes for string ref and stack alloc
Signed-off-by: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com>
2026-02-19 14:55:25 +00:00
3 changed files with 18 additions and 12 deletions

View File

@@ -229,7 +229,7 @@ missing_field_error(std::string const& name)
}
inline Json::Value
missing_field_error(Json::StaticString name)
missing_field_error(Json::StaticString const& name)
{
return missing_field_error(std::string(name));
}
@@ -247,7 +247,7 @@ object_field_error(std::string const& name)
}
inline Json::Value
object_field_error(Json::StaticString name)
object_field_error(Json::StaticString const& name)
{
return object_field_error(std::string(name));
}
@@ -259,7 +259,7 @@ invalid_field_message(std::string const& name)
}
inline std::string
invalid_field_message(Json::StaticString name)
invalid_field_message(Json::StaticString const& name)
{
return invalid_field_message(std::string(name));
}
@@ -271,7 +271,7 @@ invalid_field_error(std::string const& name)
}
inline Json::Value
invalid_field_error(Json::StaticString name)
invalid_field_error(Json::StaticString const& name)
{
return invalid_field_error(std::string(name));
}
@@ -283,7 +283,7 @@ expected_field_message(std::string const& name, std::string const& type)
}
inline std::string
expected_field_message(Json::StaticString name, std::string const& type)
expected_field_message(Json::StaticString const& name, std::string const& type)
{
return expected_field_message(std::string(name), type);
}
@@ -295,7 +295,7 @@ expected_field_error(std::string const& name, std::string const& type)
}
inline Json::Value
expected_field_error(Json::StaticString name, std::string const& type)
expected_field_error(Json::StaticString const& name, std::string const& type)
{
return expected_field_error(std::string(name), type);
}

View File

@@ -11,6 +11,7 @@
#include <numeric>
#include <stdexcept>
#include <string>
#include <string_view>
#include <type_traits>
#include <utility>
@@ -107,7 +108,7 @@ public:
int& exponent,
internalrep const& minMantissa,
internalrep const& maxMantissa,
std::string location);
std::string_view location);
// Modify the result to the correctly rounded value
template <UnsignedMantissa T>
@@ -116,7 +117,7 @@ public:
// Modify the result to the correctly rounded value
void
doRound(rep& drops, std::string location);
doRound(rep& drops, std::string_view location);
private:
void
@@ -238,7 +239,7 @@ Number::Guard::doRoundUp(
int& exponent,
internalrep const& minMantissa,
internalrep const& maxMantissa,
std::string location)
std::string_view location)
{
auto r = round();
if (r == 1 || (r == 0 && (mantissa & 1) == 1))
@@ -254,7 +255,7 @@ Number::Guard::doRoundUp(
}
bringIntoRange(negative, mantissa, exponent, minMantissa);
if (exponent > maxExponent)
throw std::overflow_error(location);
Throw<std::overflow_error>(std::string(location));
}
template <UnsignedMantissa T>
@@ -276,7 +277,7 @@ Number::Guard::doRoundDown(bool& negative, T& mantissa, int& exponent, internalr
// Modify the result to the correctly rounded value
void
Number::Guard::doRound(rep& drops, std::string location)
Number::Guard::doRound(rep& drops, std::string_view location)
{
auto r = round();
if (r == 1 || (r == 0 && (drops & 1) == 1))
@@ -290,7 +291,7 @@ Number::Guard::doRound(rep& drops, std::string location)
// or "(maxRep + 1) / 10", neither of which will round up when
// converting to rep, though the latter might overflow _before_
// rounding.
throw std::overflow_error(location); // LCOV_EXCL_LINE
throw std::overflow_error(std::string(location)); // LCOV_EXCL_LINE
}
++drops;
}

View File

@@ -984,7 +984,12 @@ amountFromJson(SField const& name, Json::Value const& v)
else if (v.isString())
{
std::string val = v.asString();
// Pre-allocate to avoid reallocation during split. This function is often
// called deep in the RPC stack (via JSON parsing) where stack space is
// limited. ASAN detected stack-buffer-overflow here at ~95% coroutine
// stack usage (1001376/1048576 bytes). Coroutine stack increased to 2MB.
std::vector<std::string> elements;
elements.reserve(3);
boost::split(elements, val, boost::is_any_of("\t\n\r ,/"));
if (elements.size() > 3)