From c1d7f28f572d0e1237599199a79d37f3ab88a4e0 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Fri, 23 Dec 2022 22:37:05 +0100 Subject: [PATCH] Applied cppcoreguidelines-pro-type-static-cast-downcast nullptr access warnings --- .../visitor/translation_unit_visitor.cc | 62 ++++++++++--------- src/common/clang_utils.cc | 17 ++--- .../visitor/translation_unit_visitor.cc | 26 ++++---- 3 files changed, 57 insertions(+), 48 deletions(-) diff --git a/src/class_diagram/visitor/translation_unit_visitor.cc b/src/class_diagram/visitor/translation_unit_visitor.cc index d0703597..73ad86bf 100644 --- a/src/class_diagram/visitor/translation_unit_visitor.cc +++ b/src/class_diagram/visitor/translation_unit_visitor.cc @@ -34,9 +34,7 @@ using clanguml::class_diagram::model::diagram; using clanguml::class_diagram::model::enum_; using clanguml::class_diagram::model::method_parameter; using clanguml::class_diagram::model::template_parameter; -using clanguml::class_diagram::model::type_alias; using clanguml::common::model::access_t; -using clanguml::common::model::decorated_element; using clanguml::common::model::namespace_; using clanguml::common::model::relationship; using clanguml::common::model::relationship_t; @@ -132,18 +130,18 @@ bool translation_unit_visitor::VisitEnumDecl(clang::EnumDecl *enm) // - the parent is a regular C++ class/struct // - the parent is a class template declaration/specialization std::optional id_opt; - int64_t local_id = - static_cast(parent)->getID(); + + const auto *parent_record_decl = + clang::dyn_cast(parent); + + int64_t local_id = parent_record_decl->getID(); id_opt = get_ast_local_id(local_id); // If not, check if the parent template declaration is in the model if (!id_opt) { - if (static_cast(parent) - ->getDescribedTemplate() != nullptr) { - local_id = static_cast(parent) - ->getDescribedTemplate() - ->getID(); + if (parent_record_decl->getDescribedTemplate() != nullptr) { + local_id = parent_record_decl->getDescribedTemplate()->getID(); id_opt = get_ast_local_id(local_id); } @@ -425,8 +423,11 @@ std::unique_ptr translation_unit_visitor::create_class_declaration( // - the parent is a regular C++ class/struct // - the parent is a class template declaration/specialization std::optional id_opt; - int64_t local_id = - static_cast(parent)->getID(); + + const auto *parent_record_decl = + clang::dyn_cast(parent); + + int64_t local_id = parent_record_decl->getID(); // First check if the parent has been added to the diagram as regular // class @@ -434,11 +435,8 @@ std::unique_ptr translation_unit_visitor::create_class_declaration( // If not, check if the parent template declaration is in the model if (!id_opt) { - local_id = static_cast(parent) - ->getDescribedTemplate() - ->getID(); - if (static_cast(parent) - ->getDescribedTemplate() != nullptr) + local_id = parent_record_decl->getDescribedTemplate()->getID(); + if (parent_record_decl->getDescribedTemplate() != nullptr) id_opt = get_ast_local_id(local_id); } @@ -580,16 +578,20 @@ void translation_unit_visitor::process_template_record_containment( const auto *parent = record.getParent(); //->getOuterLexicalRecordContext(); - if ((parent != nullptr) && - (static_cast(parent) - ->getDescribedTemplate() != nullptr)) { - auto id_opt = - get_ast_local_id(static_cast(parent) - ->getDescribedTemplate() - ->getID()); + if (parent != nullptr) { + if (const auto *record_decl = + clang::dyn_cast(parent); + record_decl != nullptr) { + if (const auto *described_template = + record_decl->getDescribedTemplate(); + described_template != nullptr) { + auto id_opt = get_ast_local_id(described_template->getID()); - if (id_opt) { - element.add_relationship({relationship_t::kContainment, *id_opt}); + if (id_opt) { + element.add_relationship( + {relationship_t::kContainment, *id_opt}); + } + } } } } @@ -609,10 +611,12 @@ void translation_unit_visitor::process_record_containment( element.set_namespace(namespace_declaration.value()); } - const auto id = common::to_id( - *static_cast(record.getParent())); - - element.add_relationship({relationship_t::kContainment, id}); + if (const auto *record_decl = + clang::dyn_cast(record.getParent()); + record_decl != nullptr) { + element.add_relationship( + {relationship_t::kContainment, common::to_id(*record_decl)}); + } } void translation_unit_visitor::process_class_bases( diff --git a/src/common/clang_utils.cc b/src/common/clang_utils.cc index 7be80898..53386199 100644 --- a/src/common/clang_utils.cc +++ b/src/common/clang_utils.cc @@ -74,9 +74,11 @@ model::namespace_ get_tag_namespace(const clang::TagDecl &declaration) // Now build up the namespace std::deque namespace_tokens; while ((parent != nullptr) && parent->isNamespace()) { - const auto *ns_decl = static_cast(parent); - if (!ns_decl->isInline() && !ns_decl->isAnonymousNamespace()) - namespace_tokens.push_front(ns_decl->getNameAsString()); + if (const auto *ns_decl = clang::dyn_cast(parent); + ns_decl != nullptr) { + if (!ns_decl->isInline() && !ns_decl->isAnonymousNamespace()) + namespace_tokens.push_front(ns_decl->getNameAsString()); + } parent = parent->getParent(); } @@ -106,10 +108,11 @@ std::string get_tag_name(const clang::TagDecl &declaration) const auto *cls_parent{declaration.getParent()}; while (cls_parent->isRecord()) { - auto parent_name = - static_cast(cls_parent) - ->getNameAsString(); - record_parent_names.push_front(parent_name); + if (const auto *record_decl = + clang::dyn_cast(cls_parent); + record_decl != nullptr) { + record_parent_names.push_front(record_decl->getNameAsString()); + } cls_parent = cls_parent->getParent(); } return fmt::format("{}", fmt::join(record_parent_names, "##")); diff --git a/src/sequence_diagram/visitor/translation_unit_visitor.cc b/src/sequence_diagram/visitor/translation_unit_visitor.cc index 98bb1c1f..196e68c4 100644 --- a/src/sequence_diagram/visitor/translation_unit_visitor.cc +++ b/src/sequence_diagram/visitor/translation_unit_visitor.cc @@ -233,9 +233,13 @@ bool translation_unit_visitor::VisitCXXMethodDecl(clang::CXXMethodDecl *m) return true; if (!m->isThisDeclarationADefinition()) { - if (m->getDefinition() != nullptr) - return VisitCXXMethodDecl( - static_cast(m->getDefinition())); + if (m->getDefinition() != nullptr) { + if (auto *method_definition = + clang::dyn_cast(m->getDefinition()); + method_definition != nullptr) { + return VisitCXXMethodDecl(method_definition); + } + } } LOG_TRACE("Visiting method {} in class {} [{}]", @@ -1232,8 +1236,10 @@ translation_unit_visitor::create_class_declaration(clang::CXXRecordDecl *cls) // - the parent is a regular C++ class/struct // - the parent is a class template declaration/specialization std::optional id_opt; - int64_t local_id = - static_cast(parent)->getID(); + const auto *parent_record_decl = + clang::dyn_cast(parent); + + int64_t local_id = parent_record_decl->getID(); // First check if the parent has been added to the diagram as // regular class @@ -1241,13 +1247,9 @@ translation_unit_visitor::create_class_declaration(clang::CXXRecordDecl *cls) // If not, check if the parent template declaration is in the model if (!id_opt && - (static_cast(parent) - ->getDescribedTemplate() != nullptr)) { - local_id = static_cast(parent) - ->getDescribedTemplate() - ->getID(); - if (static_cast(parent) - ->getDescribedTemplate() != nullptr) + (parent_record_decl->getDescribedTemplate() != nullptr)) { + parent_record_decl->getDescribedTemplate()->getID(); + if (parent_record_decl->getDescribedTemplate() != nullptr) id_opt = get_unique_id(local_id); }