34
34
#include " symbolize.h"
35
35
36
36
#include < csignal>
37
+ #include < cstring>
37
38
#include < iostream>
39
+ #include < map>
40
+ #include < string>
41
+
38
42
39
43
#include " config.h"
40
44
#include " glog/logging.h"
@@ -133,6 +137,18 @@ TEST(Symbolize, Symbolize) {
133
137
134
138
struct Foo {
135
139
static void func (int x);
140
+ static size_t longParamFunc (
141
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p0,
142
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p1,
143
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p2,
144
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p3,
145
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p4,
146
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p5,
147
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p6,
148
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p7,
149
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p8,
150
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p9
151
+ );
136
152
};
137
153
138
154
void ATTRIBUTE_NOINLINE Foo::func (int x) {
@@ -142,6 +158,21 @@ void ATTRIBUTE_NOINLINE Foo::func(int x) {
142
158
a = a + 1 ;
143
159
}
144
160
161
+ size_t ATTRIBUTE_NOINLINE Foo::longParamFunc (
162
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p0,
163
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p1,
164
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p2,
165
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p3,
166
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p4,
167
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p5,
168
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p6,
169
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p7,
170
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p8,
171
+ std::map<std::map<std::string, std::string>,std::map<std::string, std::string> > p9
172
+ ) {
173
+ return p0.size () + p1.size () + p2.size () + p3.size () + p4.size () + p5.size () + p6.size () + p7.size () + p8.size () + p9.size ();
174
+ }
175
+
145
176
// With a modern GCC, Symbolize() should return demangled symbol
146
177
// names. Function parameters should be omitted.
147
178
# ifdef TEST_WITH_MODERN_GCC
@@ -150,6 +181,10 @@ TEST(Symbolize, SymbolizeWithDemangling) {
150
181
# if !defined(_MSC_VER) || !defined(NDEBUG)
151
182
# if defined(HAVE___CXA_DEMANGLE)
152
183
EXPECT_STREQ (" Foo::func(int)" , TrySymbolize ((void *)(&Foo::func)));
184
+ // Very long functions can be truncated, but we should not crash or return null.
185
+ // Also the result should start properly.
186
+ const char * symbol = TrySymbolize ((void *)(&Foo::longParamFunc));
187
+ EXPECT_TRUE (symbol == std::strstr (symbol, " Foo::longParamFunc(" ));
153
188
# else
154
189
EXPECT_STREQ (" Foo::func()" , TrySymbolize ((void *)(&Foo::func)));
155
190
# endif
0 commit comments