Do not abort if a vector cannot increase its own capacity. In that case, push_back calls silently fail. Modify the ScopedString implementation so that it no longer requires two passes to do the format. Move the helper functions to be private member functions so that they can use push_back directly. This allows the capacity to be increased under the hood and/or silently discards data if the capacity is exceeded and cannot be increased. Add new tests for the Vector and ScopedString for capacity increase failures. Doing this so that if a map call fails, and we are attempting to write an error string, we can still get some of the message dumped. This also avoids crashing in Scudo code, and makes the caller handle any failures.
51 lines
1.6 KiB
C++
51 lines
1.6 KiB
C++
//===-- string_utils.h ------------------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SCUDO_STRING_UTILS_H_
|
|
#define SCUDO_STRING_UTILS_H_
|
|
|
|
#include "internal_defs.h"
|
|
#include "vector.h"
|
|
|
|
#include <stdarg.h>
|
|
|
|
namespace scudo {
|
|
|
|
class ScopedString {
|
|
public:
|
|
explicit ScopedString() { String.push_back('\0'); }
|
|
uptr length() { return String.size() - 1; }
|
|
const char *data() { return String.data(); }
|
|
void clear() {
|
|
String.clear();
|
|
String.push_back('\0');
|
|
}
|
|
void vappend(const char *Format, va_list &Args);
|
|
void append(const char *Format, ...) FORMAT(2, 3);
|
|
void output() const { outputRaw(String.data()); }
|
|
void reserve(size_t Size) { String.reserve(Size + 1); }
|
|
uptr capacity() { return String.capacity() - 1; }
|
|
|
|
private:
|
|
void appendNumber(u64 AbsoluteValue, u8 Base, u8 MinNumberLength,
|
|
bool PadWithZero, bool Negative, bool Upper);
|
|
void appendUnsigned(u64 Num, u8 Base, u8 MinNumberLength, bool PadWithZero,
|
|
bool Upper);
|
|
void appendSignedDecimal(s64 Num, u8 MinNumberLength, bool PadWithZero);
|
|
void appendString(int Width, int MaxChars, const char *S);
|
|
void appendPointer(u64 ptr_value);
|
|
|
|
Vector<char> String;
|
|
};
|
|
|
|
void Printf(const char *Format, ...) FORMAT(1, 2);
|
|
|
|
} // namespace scudo
|
|
|
|
#endif // SCUDO_STRING_UTILS_H_
|