From 17de8b7ded42a2be56f4f2a1c44c9dafe6a36f35 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sat, 5 Mar 2022 22:10:27 +0100 Subject: [PATCH] Prevent infinite recursion during alias resolution #18 --- src/class_diagram/visitor/translation_unit_context.cc | 7 ++++++- src/class_diagram/visitor/translation_unit_visitor.cc | 7 +++++-- src/cx/util.cc | 4 ++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/class_diagram/visitor/translation_unit_context.cc b/src/class_diagram/visitor/translation_unit_context.cc index dd66ed05..ae2fe3fb 100644 --- a/src/class_diagram/visitor/translation_unit_context.cc +++ b/src/class_diagram/visitor/translation_unit_context.cc @@ -115,7 +115,12 @@ translation_unit_context::get_type_alias_final(const cppast::cpp_type &t) const cx::util::full_name(cppast::remove_cv(t), entity_index_, false); if (has_type_alias(type_full_name)) { - return get_type_alias_final(alias_index_.at(type_full_name).get()); + const auto &alias_type = alias_index_.at(type_full_name).get(); + // Prevent infinite recursion + if (type_full_name != + cx::util::full_name( + cppast::remove_cv(alias_type), entity_index_, false)) + return get_type_alias_final(alias_type); } return type_safe::ref(t); diff --git a/src/class_diagram/visitor/translation_unit_visitor.cc b/src/class_diagram/visitor/translation_unit_visitor.cc index 0f98de94..7b2661ec 100644 --- a/src/class_diagram/visitor/translation_unit_visitor.cc +++ b/src/class_diagram/visitor/translation_unit_visitor.cc @@ -1349,8 +1349,11 @@ bool translation_unit_visitor::find_relationships_in_user_defined_type( if (ctx.has_type_alias(fn)) { LOG_DBG("Find relationship in alias of {} | {}", fn, cppast::to_string(ctx.get_type_alias(fn).get())); - found = find_relationships( - ctx.get_type_alias(fn).get(), relationships, relationship_type); + if (cppast::to_string(t_) == fn) + found = true; + else + found = find_relationships( + ctx.get_type_alias(fn).get(), relationships, relationship_type); } return found; } diff --git a/src/cx/util.cc b/src/cx/util.cc index 4907b56e..7c780a6a 100644 --- a/src/cx/util.cc +++ b/src/cx/util.cc @@ -88,6 +88,10 @@ std::string ns(const cppast::cpp_entity &e) } it = it.value().parent(); } + + if (res.empty()) + return ""; + std::reverse(res.begin(), res.end()); return fmt::format("{}", fmt::join(res, "::"));