[umbrello] [Bug 368282] New: Make type casting more robust

Ralf Habacker via KDE Bugzilla bugzilla_noreply at kde.org
Mon Sep 5 13:49:27 UTC 2016


https://bugs.kde.org/show_bug.cgi?id=368282

            Bug ID: 368282
           Summary: Make type casting more robust
           Product: umbrello
           Version: 2.20.1 (KDE Applications 16.08.1)
          Platform: Other
                OS: Linux
            Status: UNCONFIRMED
          Severity: normal
          Priority: NOR
         Component: general
          Assignee: umbrello-devel at kde.org
          Reporter: ralf.habacker at freenet.de

Umbrello UML model is designed by using several classes named UML.... Mostly of
them are based on class UMLObject. Storing uml model objects are saved in lists
of type UMLObject* for example in UMLPackage::m_objects and casted back to the
original type by using a static_cast. In several places a type check is done
before casting by using UMLObject::baseType()  to make sure not to perform
invalid casts. While working on the code in the past it turns out that this
does not work in any cases. A prominent example is in bool
UMLClassifier::resolveRef() 
... 
        if (obj->resolveRef()) {
            UMLClassifierListItem *cli =
static_cast<UMLClassifierListItem*>(obj);
            switch (cli->baseType()) {

where 'obj' is casted to UMLClassifierListItem.  Mostly objects are not of type
UMLClassifierListItem, which results into an invalid type case. Using the
related code to use a dynamic cast

        if (obj->resolveRef()) {
            UMLClassifierListItem *cli =
dynamic_cast<UMLClassifierListItem*>(obj);
            switch (cli->baseType()) {

return zero, but let umbrello crash on accessing cli->baseType() on loading a
bigger xmi file. To complete the fix the return value from dynamic_cast needs
to be checked as shown below.

        if (obj->resolveRef()) {
            UMLClassifierListItem *cli =
dynamic_cast<UMLClassifierListItem*>(obj);
            if (cli)
                return false;
            switch (cli->baseType()) {

These issues need to be fixed in the code. Because several of them are reported
by the coverity scan there is already a list of related locations.

Another issue with directly using casts is that it could be applied to any
object, although it may be not applicable as shown in the following example. In
 UMLOperation::toString() there is the following code
... 
  UMLClassifier *ownParent = static_cast<UMLClassifier*>(parent());
... 
which looks like a call to get the parent UML model object.  In fact parent()
if of type QObject (the uml model parent is returned with umlPackage()) and the
static_cast returns an invalid cast. Also dynamic_cast would fail (it will
return 0, which is not expected) 

To avoid such issues and for simplier writing of such fragements class
UMLObject should get type wrappers containing casts to related classes as shown
in the following example.

  UMLClassifier *ownParent = parent()->asUMLClassifier();

The benefit of having this style is that the compiler detects that parent() is
not of type UMLObject and fails to compile with error: 'class QObject' has no
member named 'asUMLClassifier', so we are informed at compile time of this
issue.

Reproducible: Always

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the umbrello-devel mailing list