[libcxxabi] r184477 - Another demangler crasher. Updated test suite to prevent regression.
Howard Hinnant
hhinnant at apple.com
Thu Jun 20 14:49:34 PDT 2013
Author: hhinnant
Date: Thu Jun 20 16:49:34 2013
New Revision: 184477
URL: http://llvm.org/viewvc/llvm-project?rev=184477&view=rev
Log:
Another demangler crasher. Updated test suite to prevent regression.
Modified:
libcxxabi/trunk/src/cxa_demangle.cpp
libcxxabi/trunk/test/test_demangle.cpp
Modified: libcxxabi/trunk/src/cxa_demangle.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/src/cxa_demangle.cpp?rev=184477&r1=184476&r2=184477&view=diff
==============================================================================
--- libcxxabi/trunk/src/cxa_demangle.cpp (original)
+++ libcxxabi/trunk/src/cxa_demangle.cpp Thu Jun 20 16:49:34 2013
@@ -2505,7 +2505,12 @@ parse_expr_primary(const char* first, co
switch (first[1])
{
case 'w':
- return parse_integer_literal(first+2, last, "wchar_t", db);
+ {
+ const char* t = parse_integer_literal(first+2, last, "wchar_t", db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 'b':
if (first[3] == 'E')
{
@@ -2523,37 +2528,117 @@ parse_expr_primary(const char* first, co
}
break;
case 'c':
- return parse_integer_literal(first+2, last, "char", db);
+ {
+ const char* t = parse_integer_literal(first+2, last, "char", db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 'a':
- return parse_integer_literal(first+2, last, "signed char", db);
+ {
+ const char* t = parse_integer_literal(first+2, last, "signed char", db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 'h':
- return parse_integer_literal(first+2, last, "unsigned char", db);
+ {
+ const char* t = parse_integer_literal(first+2, last, "unsigned char", db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 's':
- return parse_integer_literal(first+2, last, "short", db);
+ {
+ const char* t = parse_integer_literal(first+2, last, "short", db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 't':
- return parse_integer_literal(first+2, last, "unsigned short", db);
+ {
+ const char* t = parse_integer_literal(first+2, last, "unsigned short", db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 'i':
- return parse_integer_literal(first+2, last, "", db);
+ {
+ const char* t = parse_integer_literal(first+2, last, "", db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 'j':
- return parse_integer_literal(first+2, last, "u", db);
+ {
+ const char* t = parse_integer_literal(first+2, last, "u", db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 'l':
- return parse_integer_literal(first+2, last, "l", db);
+ {
+ const char* t = parse_integer_literal(first+2, last, "l", db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 'm':
- return parse_integer_literal(first+2, last, "ul", db);
+ {
+ const char* t = parse_integer_literal(first+2, last, "ul", db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 'x':
- return parse_integer_literal(first+2, last, "ll", db);
+ {
+ const char* t = parse_integer_literal(first+2, last, "ll", db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 'y':
- return parse_integer_literal(first+2, last, "ull", db);
+ {
+ const char* t = parse_integer_literal(first+2, last, "ull", db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 'n':
- return parse_integer_literal(first+2, last, "__int128", db);
+ {
+ const char* t = parse_integer_literal(first+2, last, "__int128", db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 'o':
- return parse_integer_literal(first+2, last, "unsigned __int128", db);
+ {
+ const char* t = parse_integer_literal(first+2, last, "unsigned __int128", db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 'f':
- return parse_floating_number<float>(first+2, last, db);
+ {
+ const char* t = parse_floating_number<float>(first+2, last, db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 'd':
- return parse_floating_number<double>(first+2, last, db);
+ {
+ const char* t = parse_floating_number<double>(first+2, last, db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case 'e':
- return parse_floating_number<long double>(first+2, last, db);
+ {
+ const char* t = parse_floating_number<long double>(first+2, last, db);
+ if (t != first+2)
+ first = t;
+ }
+ break;
case '_':
if (first[2] == 'Z')
{
@@ -3050,15 +3135,30 @@ parse_expression(const char* first, cons
switch (t[1])
{
case 'a':
- return parse_binary_expression(first+2, last, "&&", db);
+ t = parse_binary_expression(first+2, last, "&&", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'd':
- return parse_prefix_expression(first+2, last, "&", db);
+ t = parse_prefix_expression(first+2, last, "&", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'n':
- return parse_binary_expression(first+2, last, "&", db);
+ t = parse_binary_expression(first+2, last, "&", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'N':
- return parse_binary_expression(first+2, last, "&=", db);
+ t = parse_binary_expression(first+2, last, "&=", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'S':
- return parse_binary_expression(first+2, last, "=", db);
+ t = parse_binary_expression(first+2, last, "=", db);
+ if (t != first+2)
+ first = t;
+ break;
case 't':
first = parse_alignof_type(first, last, db);
break;
@@ -3077,10 +3177,15 @@ parse_expression(const char* first, cons
first = parse_call_expr(first, last, db);
break;
case 'm':
- return parse_binary_expression(first+2, last, ",", db);
+ t = parse_binary_expression(first+2, last, ",", db);
+ if (t != first+2)
+ first = t;
break;
case 'o':
- return parse_prefix_expression(first+2, last, "~", db);
+ t = parse_prefix_expression(first+2, last, "~", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'v':
first = parse_conversion_expr(first, last, db);
break;
@@ -3104,7 +3209,10 @@ parse_expression(const char* first, cons
first = parse_dynamic_cast_expr(first, last, db);
break;
case 'e':
- return parse_prefix_expression(first+2, last, "*", db);
+ t = parse_prefix_expression(first+2, last, "*", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'l':
{
const char* t1 = parse_expression(t+2, last, db);
@@ -3125,29 +3233,50 @@ parse_expression(const char* first, cons
first = parse_dot_expr(first, last, db);
break;
case 'v':
- return parse_binary_expression(first+2, last, "/", db);
+ t = parse_binary_expression(first+2, last, "/", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'V':
- return parse_binary_expression(first+2, last, "/=", db);
+ t = parse_binary_expression(first+2, last, "/=", db);
+ if (t != first+2)
+ first = t;
+ break;
}
break;
case 'e':
switch (t[1])
{
case 'o':
- return parse_binary_expression(first+2, last, "^", db);
+ t = parse_binary_expression(first+2, last, "^", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'O':
- return parse_binary_expression(first+2, last, "^=", db);
+ t = parse_binary_expression(first+2, last, "^=", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'q':
- return parse_binary_expression(first+2, last, "==", db);
+ t = parse_binary_expression(first+2, last, "==", db);
+ if (t != first+2)
+ first = t;
+ break;
}
break;
case 'g':
switch (t[1])
{
case 'e':
- return parse_binary_expression(first+2, last, ">=", db);
+ t = parse_binary_expression(first+2, last, ">=", db);
+ if (t != first+2)
+ first = t;
+ break;
case 't':
- return parse_binary_expression(first+2, last, ">", db);
+ t = parse_binary_expression(first+2, last, ">", db);
+ if (t != first+2)
+ first = t;
+ break;
}
break;
case 'i':
@@ -3174,29 +3303,57 @@ parse_expression(const char* first, cons
switch (t[1])
{
case 'e':
- return parse_binary_expression(first+2, last, "<=", db);
+ t = parse_binary_expression(first+2, last, "<=", db);
+ if (t != first+2)
+ first = t;
+ break;
case 's':
- return parse_binary_expression(first+2, last, "<<", db);
+ t = parse_binary_expression(first+2, last, "<<", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'S':
- return parse_binary_expression(first+2, last, "<<=", db);
+ t = parse_binary_expression(first+2, last, "<<=", db);
+ if (t != first+2)
+ first = t;
+ break;
case 't':
- return parse_binary_expression(first+2, last, "<", db);
+ t = parse_binary_expression(first+2, last, "<", db);
+ if (t != first+2)
+ first = t;
+ break;
}
break;
case 'm':
switch (t[1])
{
case 'i':
- return parse_binary_expression(first+2, last, "-", db);
+ t = parse_binary_expression(first+2, last, "-", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'I':
- return parse_binary_expression(first+2, last, "-=", db);
+ t = parse_binary_expression(first+2, last, "-=", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'l':
- return parse_binary_expression(first+2, last, "*", db);
+ t = parse_binary_expression(first+2, last, "*", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'L':
- return parse_binary_expression(first+2, last, "*=", db);
+ t = parse_binary_expression(first+2, last, "*=", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'm':
if (first+2 != last && first[2] == '_')
- return parse_prefix_expression(first+3, last, "--", db);
+ {
+ t = parse_prefix_expression(first+3, last, "--", db);
+ if (t != first+3)
+ first = t;
+ }
else
{
const char* t1 = parse_expression(first+2, last, db);
@@ -3217,13 +3374,25 @@ parse_expression(const char* first, cons
first = parse_new_expr(first, last, db);
break;
case 'e':
- return parse_binary_expression(first+2, last, "!=", db);
+ t = parse_binary_expression(first+2, last, "!=", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'g':
- return parse_prefix_expression(first+2, last, "-", db);
+ t = parse_prefix_expression(first+2, last, "-", db);
+ if (t != first+2)
+ first = t;
+ break;
case 't':
- return parse_prefix_expression(first+2, last, "!", db);
+ t = parse_prefix_expression(first+2, last, "!", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'x':
- return parse_noexcept_expression(first+2, last, db);
+ t = parse_noexcept_expression(first+2, last, db);
+ if (t != first+2)
+ first = t;
+ break;
}
break;
case 'o':
@@ -3232,25 +3401,47 @@ parse_expression(const char* first, cons
case 'n':
return parse_unresolved_name(first, last, db);
case 'o':
- return parse_binary_expression(first+2, last, "||", db);
+ t = parse_binary_expression(first+2, last, "||", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'r':
- return parse_binary_expression(first+2, last, "|", db);
+ t = parse_binary_expression(first+2, last, "|", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'R':
- return parse_binary_expression(first+2, last, "|=", db);
+ t = parse_binary_expression(first+2, last, "|=", db);
+ if (t != first+2)
+ first = t;
+ break;
}
break;
case 'p':
switch (t[1])
{
case 'm':
- return parse_binary_expression(first+2, last, "->*", db);
+ t = parse_binary_expression(first+2, last, "->*", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'l':
- return parse_binary_expression(first+2, last, "+", db);
+ t = parse_binary_expression(first+2, last, "+", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'L':
- return parse_binary_expression(first+2, last, "+=", db);
+ t = parse_binary_expression(first+2, last, "+=", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'p':
if (first+2 != last && first[2] == '_')
- return parse_prefix_expression(first+3, last, "++", db);
+ {
+ t = parse_prefix_expression(first+3, last, "++", db);
+ if (t != first+3)
+ first = t;
+ }
else
{
const char* t1 = parse_expression(first+2, last, db);
@@ -3262,7 +3453,10 @@ parse_expression(const char* first, cons
}
break;
case 's':
- return parse_prefix_expression(first+2, last, "+", db);
+ t = parse_prefix_expression(first+2, last, "+", db);
+ if (t != first+2)
+ first = t;
+ break;
case 't':
first = parse_arrow_expr(first, last, db);
break;
@@ -3306,13 +3500,25 @@ parse_expression(const char* first, cons
first = parse_reinterpret_cast_expr(first, last, db);
break;
case 'm':
- return parse_binary_expression(first+2, last, "%", db);
+ t = parse_binary_expression(first+2, last, "%", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'M':
- return parse_binary_expression(first+2, last, "%=", db);
+ t = parse_binary_expression(first+2, last, "%=", db);
+ if (t != first+2)
+ first = t;
+ break;
case 's':
- return parse_binary_expression(first+2, last, ">>", db);
+ t = parse_binary_expression(first+2, last, ">>", db);
+ if (t != first+2)
+ first = t;
+ break;
case 'S':
- return parse_binary_expression(first+2, last, ">>=", db);
+ t = parse_binary_expression(first+2, last, ">>=", db);
+ if (t != first+2)
+ first = t;
+ break;
}
break;
case 's':
Modified: libcxxabi/trunk/test/test_demangle.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/test_demangle.cpp?rev=184477&r1=184476&r2=184477&view=diff
==============================================================================
--- libcxxabi/trunk/test/test_demangle.cpp (original)
+++ libcxxabi/trunk/test/test_demangle.cpp Thu Jun 20 16:49:34 2013
@@ -29590,6 +29590,7 @@ const unsigned N = sizeof(cases) / sizeo
const char* invalid_cases[] =
{
"_ZIPPreEncode",
+ "Agentt",
};
const unsigned NI = sizeof(invalid_cases) / sizeof(invalid_cases[0]);
More information about the cfe-commits
mailing list