mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 15:41:46 +00:00
__list::ends_with_template was giving the wrong answer for empty lists. And __parse_unnamed_type_name wasn't properly handling the list of paramters and was not safe against incorrectly mangled lambdas (running past last).
llvm-svn: 169022
This commit is contained in:
parent
af8f02634b
commit
c1c87c15f2
@ -133,9 +133,14 @@ void display(__node* x, int indent = 0)
|
||||
{
|
||||
for (int i = 0; i < 2*indent; ++i)
|
||||
printf(" ");
|
||||
char* buf = (char*)malloc(x->size());
|
||||
size_t sz = x->size();
|
||||
char* buf = (char*)calloc(sz+10, 1);
|
||||
x->get_demangled_name(buf);
|
||||
printf("%s %s, %p\n", typeid(*x).name(), buf, x);
|
||||
printf("%s [%ld] %s, %p\n", typeid(*x).name(), sz, buf, x);
|
||||
if (strlen(buf) != sz)
|
||||
{
|
||||
printf("strlen(buf) = %ld and size = %ld\n", strlen(buf), sz);
|
||||
}
|
||||
free(buf);
|
||||
display(x->__left_, indent+1);
|
||||
display(x->__right_, indent+1);
|
||||
@ -3822,10 +3827,14 @@ public:
|
||||
}
|
||||
virtual bool ends_with_template(bool parsing = false) const
|
||||
{
|
||||
if (__right_ != NULL)
|
||||
if (__right_ && __right_->size() > 0)
|
||||
{
|
||||
return __right_->ends_with_template(parsing);
|
||||
if (__left_ != NULL)
|
||||
}
|
||||
else if (__left_ && __left_->size() > 0)
|
||||
{
|
||||
return __left_->ends_with_template(parsing);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
virtual bool fix_forward_references(__node** t_begin, __node** t_end)
|
||||
@ -6969,50 +6978,62 @@ __demangle_tree::__parse_unnamed_type_name(const char* first, const char* last)
|
||||
{
|
||||
case 't':
|
||||
case 'l':
|
||||
first += 2;
|
||||
|
||||
{
|
||||
const char* t = first + 2;
|
||||
__node* params = 0;
|
||||
if (type == 'l')
|
||||
{
|
||||
__root_ = 0;
|
||||
if (first[0] == 'v')
|
||||
if (*t == 'v')
|
||||
{
|
||||
// void lambda
|
||||
++first;
|
||||
if (first[0] == 'E')
|
||||
++first;
|
||||
++t;
|
||||
if (t != last && *t == 'E')
|
||||
++t;
|
||||
else
|
||||
return first;
|
||||
}
|
||||
else
|
||||
{
|
||||
while (first[0] && first[0] != 'E')
|
||||
{
|
||||
const char *old = first;
|
||||
first = __parse_type(first, last);
|
||||
if (first == old)
|
||||
break;
|
||||
}
|
||||
if (first[0] == 'E')
|
||||
++first;
|
||||
else
|
||||
const char* t1 = __parse_type(t, last);
|
||||
if (t1 == t || !__make<__list>(__root_))
|
||||
return first;
|
||||
params = __root_;
|
||||
__node* prev = params;
|
||||
t = t1;
|
||||
while (true)
|
||||
{
|
||||
t1 = __parse_type(t, last);
|
||||
if (t1 == t)
|
||||
break;
|
||||
if (!__make<__list>(__root_))
|
||||
return first;
|
||||
t = t1;
|
||||
prev->__right_ = __root_;
|
||||
__root_->__size_ = prev->__size_ + 1;
|
||||
prev = __root_;
|
||||
}
|
||||
if (t == last || *t != 'E')
|
||||
return first;
|
||||
++t;
|
||||
}
|
||||
}
|
||||
const char *number_start = first;
|
||||
first = __parse_number(first, last);
|
||||
const char *number_end = first;
|
||||
if (first[0] == '_')
|
||||
const char* number_start = t;
|
||||
const char* number_end = __parse_number(t, last);
|
||||
if (number_end == last || *number_end != '_')
|
||||
return first;
|
||||
t = number_end + 1;
|
||||
if (type == 'l')
|
||||
{
|
||||
++first;
|
||||
if (!__make<__lambda_node>(params, number_start, static_cast<size_t>(number_end - number_start)))
|
||||
return first;
|
||||
}
|
||||
else
|
||||
return first;
|
||||
|
||||
if (type == 'l')
|
||||
__make<__lambda_node>(__root_, number_start, static_cast<size_t>(number_end - number_start));
|
||||
else
|
||||
__make<__unnamed>(number_start, static_cast<size_t>(number_end - number_start));
|
||||
|
||||
{
|
||||
if (!__make<__unnamed>(number_start, static_cast<size_t>(number_end - number_start)))
|
||||
return first;
|
||||
}
|
||||
first = t;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -29568,6 +29568,7 @@ const char* cases[][2] =
|
||||
{"_ZZN4NIds4NStr14TCStrAggregateINS0_13TCTCStrTraitsINS0_11TCStrTraitsIcNS0_17CDefaultStrParamsEEENS0_14TCStrImp_FixedIS5_Lx256EEEEEE21f_AddFromIteratorUTF8INS0_16CStrIteratorUTF8EEEvRxRKT_ENKSA_ISB_EUlmE0_clEm", "void NIds::NStr::TCStrAggregate<NIds::NStr::TCTCStrTraits<NIds::NStr::TCStrTraits<char, NIds::NStr::CDefaultStrParams>, NIds::NStr::TCStrImp_Fixed<NIds::NStr::TCStrTraits<char, NIds::NStr::CDefaultStrParams>, 256ll> > >::f_AddFromIteratorUTF8<NIds::NStr::CStrIteratorUTF8>(long long&, NIds::NStr::CStrIteratorUTF8 const&)::NIds::NStr::TCStrAggregate<NIds::NStr::TCTCStrTraits<NIds::NStr::TCStrTraits<char, NIds::NStr::CDefaultStrParams>, NIds::NStr::TCStrImp_Fixed<NIds::NStr::TCStrTraits<char, NIds::NStr::CDefaultStrParams>, 256ll> > >::f_AddFromIteratorUTF8<NIds::NStr::CStrIteratorUTF8>::'lambda0'(unsigned long)::operator()(unsigned long) const"},
|
||||
{"_ZZN4NIds4NStr14TCStrAggregateINS0_13TCTCStrTraitsINS0_11TCStrTraitsIcNS0_17CDefaultStrParamsEEENS0_14TCStrImp_FixedIS5_Lx256EEEEEE21f_AddFromIteratorUTF8INS0_16CStrIteratorUTF8EEEvRxRKT_ENKSA_ISB_EUt0_clEm", "void NIds::NStr::TCStrAggregate<NIds::NStr::TCTCStrTraits<NIds::NStr::TCStrTraits<char, NIds::NStr::CDefaultStrParams>, NIds::NStr::TCStrImp_Fixed<NIds::NStr::TCStrTraits<char, NIds::NStr::CDefaultStrParams>, 256ll> > >::f_AddFromIteratorUTF8<NIds::NStr::CStrIteratorUTF8>(long long&, NIds::NStr::CStrIteratorUTF8 const&)::NIds::NStr::TCStrAggregate<NIds::NStr::TCTCStrTraits<NIds::NStr::TCStrTraits<char, NIds::NStr::CDefaultStrParams>, NIds::NStr::TCStrImp_Fixed<NIds::NStr::TCStrTraits<char, NIds::NStr::CDefaultStrParams>, 256ll> > >::f_AddFromIteratorUTF8<NIds::NStr::CStrIteratorUTF8>::'unnamed0'::operator()(unsigned long) const"},
|
||||
{"_ZNK3com9markzware2js11cJSArgumentcvRKT_I8cMyClassEEv", "com::markzware::js::cJSArgument::operator cMyClass const &<cMyClass>() const"},
|
||||
{"_ZNKSt3__110__function6__funcIZN4DLCL8DLFutureIP15AnalysenManagerE3setINS_8functionIFS5_vEEEJEEEvT_DpOT0_EUlvE_NS_9allocatorISF_EEFvvEE7__cloneEv", "std::__1::__function::__func<void DLCL::DLFuture<AnalysenManager*>::set<std::__1::function<AnalysenManager* ()> >(std::__1::function<AnalysenManager* ()>)::'lambda'(), std::__1::allocator<void DLCL::DLFuture<AnalysenManager*>::set<std::__1::function<AnalysenManager* ()> >(std::__1::function<AnalysenManager* ()>)::'lambda'()>, void ()>::__clone() const"},
|
||||
};
|
||||
|
||||
const unsigned N = sizeof(cases) / sizeof(cases[0]);
|
||||
@ -29602,6 +29603,37 @@ void test()
|
||||
free(buf);
|
||||
}
|
||||
|
||||
void test2()
|
||||
{
|
||||
std::size_t len = 0;
|
||||
char* buf = nullptr;
|
||||
for (unsigned i = 0; i < N; ++i)
|
||||
{
|
||||
int status;
|
||||
char* demang = __cxxabiv1::__cxa_demangle(cases[i][0], buf, &len, &status);
|
||||
if (demang == 0 || std::strcmp(demang, cases[i][1]) != 0)
|
||||
{
|
||||
std::cout << cases[i][0] << " -> " << cases[i][1] << '\n';
|
||||
if (demang)
|
||||
{
|
||||
std::cout << "Got instead: " << demang << '\n';
|
||||
assert(std::strcmp(demang, cases[i][1]) == 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Got instead: NULL, " << status << '\n';
|
||||
assert(demang != 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
free(demang);
|
||||
len = 0;
|
||||
}
|
||||
}
|
||||
free(buf);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
typedef std::chrono::high_resolution_clock Clock;
|
||||
@ -29620,7 +29652,6 @@ int main()
|
||||
int status;
|
||||
len = 0;
|
||||
char* demang = abi::__cxa_demangle(input.c_str(), 0, &len, &status);
|
||||
Clock::time_point t1 = Clock::now();
|
||||
switch (status)
|
||||
{
|
||||
case -3:
|
||||
|
Loading…
Reference in New Issue
Block a user