15 #include "absl/debugging/internal/demangle.h"
20 #include "gtest/gtest.h"
21 #include "absl/base/config.h"
22 #include "absl/base/internal/raw_logging.h"
23 #include "absl/debugging/internal/stack_consumption.h"
24 #include "absl/memory/memory.h"
28 namespace debugging_internal {
32 static const char *DemangleIt(
const char *
const mangled) {
33 static char demangled[4096];
34 if (
Demangle(mangled, demangled,
sizeof(demangled))) {
108 #if defined(ABSL_INTERNAL_HAVE_DEBUGGING_STACK_CONSUMPTION) && \
109 !defined(ABSL_HAVE_ADDRESS_SANITIZER) && \
110 !defined(ABSL_HAVE_MEMORY_SANITIZER) && \
111 !defined(ABSL_HAVE_THREAD_SANITIZER)
113 static const char *g_mangled;
114 static char g_demangle_buffer[4096];
115 static char *g_demangle_result;
117 static void DemangleSignalHandler(
int signo) {
118 if (
Demangle(g_mangled, g_demangle_buffer,
sizeof(g_demangle_buffer))) {
119 g_demangle_result = g_demangle_buffer;
121 g_demangle_result =
nullptr;
126 static const char *DemangleStackConsumption(
const char *mangled,
127 int *stack_consumed) {
129 *stack_consumed = GetSignalHandlerStackConsumption(DemangleSignalHandler);
131 return g_demangle_result;
138 const int kStackConsumptionUpperLimit = 8192;
144 mangled_name +=
"IXL";
145 mangled_name += NestedMangledName(
depth - 1);
146 mangled_name +=
"EEE";
157 int stack_consumed = 0;
159 const char *demangled =
160 DemangleStackConsumption(
"_Z6foobarv", &stack_consumed);
163 EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);
165 const std::string nested_mangled_name0 = NestedMangledName(0);
166 demangled = DemangleStackConsumption(nested_mangled_name0.c_str(),
170 EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);
172 const std::string nested_mangled_name1 = NestedMangledName(1);
173 demangled = DemangleStackConsumption(nested_mangled_name1.c_str(),
177 EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);
179 const std::string nested_mangled_name2 = NestedMangledName(2);
180 demangled = DemangleStackConsumption(nested_mangled_name2.c_str(),
184 EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);
186 const std::string nested_mangled_name3 = NestedMangledName(3);
187 demangled = DemangleStackConsumption(nested_mangled_name3.c_str(),
191 EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit);
194 #endif // Stack consumption tests
196 static void TestOnInput(
const char*
input) {
197 static const int kOutSize = 1048576;
198 auto out = absl::make_unique<char[]>(kOutSize);
202 TEST(DemangleRegression, NegativeLength) {
203 TestOnInput(
"_ZZn4");
206 TEST(DemangleRegression, DeeplyNestedArrayType) {
207 const int depth = 100000;
210 for (
int i = 0;
i <
depth;
i++) {
213 TestOnInput(
data.c_str());