3434#include " symbolize.h"
3535
3636#include < csignal>
37+ #include < cstring>
3738#include < iostream>
39+ #include < map>
40+ #include < string>
41+
3842
3943#include " config.h"
4044#include " glog/logging.h"
@@ -133,6 +137,18 @@ TEST(Symbolize, Symbolize) {
133137
134138struct Foo {
135139 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+ );
136152};
137153
138154void ATTRIBUTE_NOINLINE Foo::func (int x) {
@@ -142,6 +158,21 @@ void ATTRIBUTE_NOINLINE Foo::func(int x) {
142158 a = a + 1 ;
143159}
144160
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+
145176// With a modern GCC, Symbolize() should return demangled symbol
146177// names. Function parameters should be omitted.
147178# ifdef TEST_WITH_MODERN_GCC
@@ -150,6 +181,10 @@ TEST(Symbolize, SymbolizeWithDemangling) {
150181# if !defined(_MSC_VER) || !defined(NDEBUG)
151182# if defined(HAVE___CXA_DEMANGLE)
152183 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(" ));
153188# else
154189 EXPECT_STREQ (" Foo::func()" , TrySymbolize ((void *)(&Foo::func)));
155190# endif
0 commit comments