Summary: | segmentation fault in umbrello | ||
---|---|---|---|
Product: | [Applications] umbrello | Reporter: | Nikita Manovich <nikita.manovich> |
Component: | general | Assignee: | Oliver Kellogg <okellogg> |
Status: | RESOLVED FIXED | ||
Severity: | crash | ||
Priority: | NOR | ||
Version: | unspecified | ||
Target Milestone: | --- | ||
Platform: | Compiled Sources | ||
OS: | Linux | ||
Latest Commit: | Version Fixed In: | ||
Sentry Crash Report: | |||
Attachments: | mpp.xmi |
Description
Nikita Manovich
2007-05-04 17:06:53 UTC
SVN commit 661210 by okellogg: It seems that a previous version of Umbrello could create XMI files where some model objects were missing. This is a workaround so that Umbrello at least doesn't crash on loading such a file: validateObjType(): Pass in the UMLObject* by reference. Add a Uml::IDType arg. When the UMLObject* is NULL then create a new object with an artificial name, "LOST_" followed by the id, and set its ID to the arg passed in. This means that the user needs to manually rename the LOST_ items after loading a corrupted file. Sorry. BUG:145035 M +1 -0 ChangeLog M +25 -14 umbrello/widget_factory.cpp --- branches/KDE/3.5/kdesdk/umbrello/ChangeLog #661209:661210 @@ -35,6 +35,7 @@ * No synchronisation of comments when round-tripping (144346) * Crash when loading xmi with actor as object of sequence diagram (144442) * ActionScript/JavaScript association code generation error (144788) +* Segmentation fault on loading corrupted file (145035) Version 1.5.61 --- branches/KDE/3.5/kdesdk/umbrello/umbrello/widget_factory.cpp #661209:661210 @@ -19,6 +19,7 @@ #include "uml.h" #include "umldoc.h" #include "umlview.h" +#include "object_factory.h" #include "floatingtextwidget.h" #include "classifierwidget.h" #include "classifier.h" @@ -138,9 +139,19 @@ return newWidget; } -bool validateObjType(Uml::Object_Type expected, UMLObject *o) { - if (o == NULL) - return true; // cannot validate +bool validateObjType(Uml::Object_Type expected, UMLObject* &o, Uml::IDType id) { + if (o == NULL) { + kDebug() << "Widget_Factory::validateObjType: creating new object of type " + << expected << endl; + QString artificialName = "LOST_" + ID2STR(id); + o = Object_Factory::createUMLObject(expected, artificialName, NULL, false); + if (o == NULL) + return false; + o->setID(id); + UMLPackage *parentPkg = o->getUMLPackage(); + parentPkg->addObject(o); + return true; + } Uml::Object_Type actual = o->getBaseType(); if (actual == expected) return true; @@ -186,40 +197,40 @@ if (tag == "actorwidget" || tag == "UML:ActorWidget") { // for bkwd compatibility - if (validateObjType(Uml::ot_Actor, o)) + if (validateObjType(Uml::ot_Actor, o, id)) widget = new ActorWidget(view, static_cast<UMLActor*>(o)); } else if (tag == "usecasewidget" || tag == "UML:UseCaseWidget") { // for bkwd compatibility - if (validateObjType(Uml::ot_UseCase, o)) + if (validateObjType(Uml::ot_UseCase, o, id)) widget = new UseCaseWidget(view, static_cast<UMLUseCase*>(o)); } else if (tag == "classwidget" || tag == "UML:ClassWidget" // for bkwd compatibility || tag == "UML:ConceptWidget") { // for bkwd compatibility - if (validateObjType(Uml::ot_Class, o)) + if (validateObjType(Uml::ot_Class, o, id)) widget = new ClassifierWidget(view, static_cast<UMLClassifier*>(o)); } else if (tag == "packagewidget") { - if (validateObjType(Uml::ot_Package, o)) + if (validateObjType(Uml::ot_Package, o, id)) widget = new PackageWidget(view, static_cast<UMLPackage*>(o)); } else if (tag == "componentwidget") { - if (validateObjType(Uml::ot_Component, o)) + if (validateObjType(Uml::ot_Component, o, id)) widget = new ComponentWidget(view, static_cast<UMLComponent*>(o)); } else if (tag == "nodewidget") { - if (validateObjType(Uml::ot_Node, o)) + if (validateObjType(Uml::ot_Node, o, id)) widget = new NodeWidget(view, static_cast<UMLNode*>(o)); } else if (tag == "artifactwidget") { - if (validateObjType(Uml::ot_Artifact, o)) + if (validateObjType(Uml::ot_Artifact, o, id)) widget = new ArtifactWidget(view, static_cast<UMLArtifact*>(o)); } else if (tag == "interfacewidget") { - if (validateObjType(Uml::ot_Interface, o)) + if (validateObjType(Uml::ot_Interface, o, id)) widget = new ClassifierWidget(view, static_cast<UMLClassifier*>(o)); } else if (tag == "datatypewidget") { - if (validateObjType(Uml::ot_Datatype, o)) + if (validateObjType(Uml::ot_Datatype, o, id)) widget = new DatatypeWidget(view, static_cast<UMLClassifier*>(o)); } else if (tag == "enumwidget") { - if (validateObjType(Uml::ot_Enum, o)) + if (validateObjType(Uml::ot_Enum, o, id)) widget = new EnumWidget(view, static_cast<UMLEnum*>(o)); } else if (tag == "entitywidget") { - if (validateObjType(Uml::ot_Entity, o)) + if (validateObjType(Uml::ot_Entity, o, id)) widget = new EntityWidget(view, static_cast<UMLEntity*>(o)); } else if (tag == "objectwidget" || tag == "UML:ObjectWidget") { // for bkwd compatibility Hi, I believe that the probem has been fixed, but today I have found another issue: umbrello doesn't work at all. I wasted about a day and all my work has been lost. Umbrello crashes several times. Please, see mpp.xmi file and you understand my problems (I didn't create AkH6JFF3aUgd element). For reproducing the bug you need to create any elements, in 'Tree View' copy, cut and paste elements and after that 'undo' this actions. I'm sure that you get elements with strange names, unexpected elements, seg. fault and so on. I'm disappointed! :-( -- Best regards, Nikita Manovich. В сообщении от 4 мая 2007 22:20 Oliver Kellogg написал(a): [bugs.kde.org quoted mail] Created an attachment (id=20491) mpp.xmi |