diff options
author | Kostya Kortchinsky <kostyak@google.com> | 2019-10-09 15:09:28 +0000 |
---|---|---|
committer | Kostya Kortchinsky <kostyak@google.com> | 2019-10-09 15:09:28 +0000 |
commit | e5d05814ac964a37eb336fb5a743227e55e85a41 (patch) | |
tree | 5f523fd7bc248b230732ec33ca41cd2679d36b2c /lib/scudo/standalone/string_utils.cpp | |
parent | b185f4f2ef7c96095d31e09b041ffe81b4b24571 (diff) | |
download | compiler-rt-e5d05814ac964a37eb336fb5a743227e55e85a41.tar.gz |
[scudo][standalone] Get statistics in a char buffer
Summary:
Following up on D68471, this CL introduces some `getStats` APIs to
gather statistics in char buffers (`ScopedString` really) instead of
printing them out right away. Ultimately `printStats` will just
output the buffer, but that allows us to potentially do some work
on the intermediate buffer, and can be used for a `mallocz` type
of functionality. This allows us to pretty much get rid of all the
`Printf` calls around, but I am keeping the function in for
debugging purposes.
This changes the existing tests to use the new APIs when required.
I will add new tests as suggested in D68471 in another CL.
Reviewers: morehouse, hctim, vitalybuka, eugenis, cferris
Reviewed By: morehouse
Subscribers: delcypher, #sanitizers, llvm-commits
Tags: #llvm, #sanitizers
Differential Revision: https://reviews.llvm.org/D68653
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@374173 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/scudo/standalone/string_utils.cpp')
-rw-r--r-- | lib/scudo/standalone/string_utils.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/scudo/standalone/string_utils.cpp b/lib/scudo/standalone/string_utils.cpp index 22b4fbd74..5de8b57bf 100644 --- a/lib/scudo/standalone/string_utils.cpp +++ b/lib/scudo/standalone/string_utils.cpp @@ -208,9 +208,18 @@ int formatString(char *Buffer, uptr BufferLength, const char *Format, } void ScopedString::append(const char *Format, va_list Args) { - CHECK_LT(Length, String.size()); - formatString(String.data() + Length, String.size() - Length, Format, Args); - Length += strlen(String.data() + Length); + DCHECK_LT(Length, String.size()); + va_list ArgsCopy; + va_copy(ArgsCopy, Args); + // formatString doesn't currently support a null buffer or zero buffer length, + // so in order to get the resulting formatted string length, we use a one-char + // buffer. + char C[1]; + const uptr AdditionalLength = + static_cast<uptr>(formatString(C, sizeof(C), Format, Args)) + 1; + String.resize(Length + AdditionalLength); + formatString(String.data() + Length, AdditionalLength, Format, ArgsCopy); + Length = strlen(String.data()); CHECK_LT(Length, String.size()); } @@ -226,7 +235,7 @@ FORMAT(1, 2) void Printf(const char *Format, ...) { va_list Args; va_start(Args, Format); - ScopedString Msg(512); + ScopedString Msg(1024); Msg.append(Format, Args); outputRaw(Msg.data()); va_end(Args); |