https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85304

Michael Matz <matz at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |matz at gcc dot gnu.org

--- Comment #1 from Michael Matz <matz at gcc dot gnu.org> ---
Similar to https://sourceware.org/bugzilla/show_bug.cgi?id=23008,
the testcase contains a mangled name with roughly 29000 successive 'E'
characters.  Processing one 'E' character involves calling these three
routines:

5  0x00000000004e8901 in demangle_expression (work=0x7fffffffd810,
mangled=0x7fffffffd710, 
    s=0x7fffffffd540, tk=tk_integral) at ../../libiberty/cplus-dem.c:1895
1895          success = demangle_template_value_parm (work, mangled, s, tk);
(gdb) 
#4  0x00000000004e98cb in demangle_template_value_parm (work=0x7fffffffd810,
mangled=0x7fffffffd710, 
    s=0x7fffffffd540, tk=tk_integral) at ../../libiberty/cplus-dem.c:2069
2069        success = demangle_integral_value (work, mangled, s);
(gdb) 
#3  0x00000000004e8b82 in demangle_integral_value (work=0x7fffffffd810,
mangled=0x7fffffffd710, 
    s=0x7fffffffd540) at ../../libiberty/cplus-dem.c:1916
1916        success = demangle_expression (work, mangled, s, tk_integral);

That advances *mangled by one character and uses 496 bytes of stack while
doing that (when compiled by gcc-6 with address sanitizer).  The linux default
stack of 8 MB is good for 16893 of the E characters until stack overflow
occurs.
Without sanitizer we need less stack per recursion level, so that the testcase
doesn't cause a proplem (but just increasing the number of 'E' will make
it segfault there as well).

It seems all is working as designed, you request it to demangle a recursive
structure of > 20000 levels deep and get what can be expected from that, a
stack
overflow.

Reply via email to