[dia] [scan-build] Result of operation is garbage or undefined (not!)



commit 6df23c3ad2ae2fb8832c90c4a1aaaeba3bd67ee3
Author: Hans Breuer <hans breuer org>
Date:   Sun Jun 8 21:22:39 2014 +0200

    [scan-build] Result of operation is garbage or undefined (not!)
    
    The addition od DIA_IS_DIAGRAM made scan-build belief that self->data
    could be NULL and thus every later, unchecked access was marked being
    suspiciuous. Avoid that by rearranging the code with diagram handling
    to it's own block.

 plug-ins/python/pydia-diagramdata.c |   64 +++++++++++++++++------------------
 1 files changed, 31 insertions(+), 33 deletions(-)
---
diff --git a/plug-ins/python/pydia-diagramdata.c b/plug-ins/python/pydia-diagramdata.c
index dfda2b9..6b0bedf 100644
--- a/plug-ins/python/pydia-diagramdata.c
+++ b/plug-ins/python/pydia-diagramdata.c
@@ -342,11 +342,7 @@ static PyMemberDef PyDiaDiagramData_Members[] = {
 static PyObject *
 PyDiaDiagramData_GetAttr(PyDiaDiagramData *self, gchar *attr)
 {
-    DiagramData *data = DIA_DIAGRAM_DATA(self->data);
-    Diagram *diagram = NULL;
-
-    if (DIA_IS_DIAGRAM (self->data))
-       diagram = DIA_DIAGRAM(self->data);
+    DiagramData *data = self->data;
 
     if (!strcmp(attr, "__members__"))
        return Py_BuildValue("[ssssssssssss]",
@@ -373,28 +369,7 @@ PyDiaDiagramData_GetAttr(PyDiaDiagramData *self, gchar *attr)
        return PyDiaLayer_New(data->active_layer);
     } else if (!strcmp(attr, "paper")) {
         return PyDiaPaperinfo_New (&data->paper);
-    }
-    else if (diagram && !strcmp(attr, "grid_width")) 
-      return Py_BuildValue("(dd)", diagram->grid.width_x, diagram->grid.width_y);
-    else if (diagram && !strcmp(attr, "grid_visible")) 
-      return Py_BuildValue("(ii)", diagram->grid.visible_x, diagram->grid.visible_y);
-    else if (diagram && !strcmp(attr, "hguides")) {
-      int len = diagram->guides.nhguides;
-      PyObject *ret = PyTuple_New(len);
-      int i;
-      for (i = 0; i < len; i++)
-        PyTuple_SetItem(ret, i, PyFloat_FromDouble(diagram->guides.hguides[i]));
-      return ret;
-    }
-    else if (diagram && !strcmp(attr, "vguides")) {
-      int len = diagram->guides.nvguides;
-      PyObject *ret = PyTuple_New(len);
-      int i;
-      for (i = 0; i < len; i++)
-        PyTuple_SetItem(ret, i, PyFloat_FromDouble(diagram->guides.vguides[i]));
-      return ret;
-    }
-    else if (!strcmp(attr, "layers")) {
+    } else if (!strcmp(attr, "layers")) {
        guint i, len = data->layers->len;
        PyObject *ret = PyTuple_New(len);
 
@@ -402,11 +377,9 @@ PyDiaDiagramData_GetAttr(PyDiaDiagramData *self, gchar *attr)
            PyTuple_SetItem(ret, i, PyDiaLayer_New(
                        g_ptr_array_index(self->data->layers, i)));
        return ret;
-    }
-    else if (!strcmp(attr, "active_layer")) {
+    } else if (!strcmp(attr, "active_layer")) {
       return PyDiaLayer_New(data->active_layer);
-    }
-    else if (!strcmp(attr, "selected")) {
+    } else if (!strcmp(attr, "selected")) {
        PyObject *ret;
        GList *tmp;
        gint i;
@@ -415,12 +388,37 @@ PyDiaDiagramData_GetAttr(PyDiaDiagramData *self, gchar *attr)
        for (i = 0, tmp = data->selected; tmp; i++, tmp = tmp->next)
            PyTuple_SetItem(ret, i, PyDiaObject_New((DiaObject *)tmp->data));
        return ret;
-    }
-    else if (!strcmp(attr, "diagram")) {
+    } else if (!strcmp(attr, "diagram")) {
        if (DIA_IS_DIAGRAM (self->data))
            return PyDiaDiagram_New (DIA_DIAGRAM (self->data));
        Py_INCREF(Py_None);
        return Py_None;
+    } else {
+      /* In the interactive case diagramdata is_a diagram */
+      if (DIA_IS_DIAGRAM (self->data)) {
+       Diagram *diagram = DIA_DIAGRAM(self->data);
+       if (diagram) { /* paranoid and helping scan-build */
+         if (!strcmp(attr, "grid_width")) 
+           return Py_BuildValue("(dd)", diagram->grid.width_x, diagram->grid.width_y);
+         else if (!strcmp(attr, "grid_visible"))
+           return Py_BuildValue("(ii)", diagram->grid.visible_x, diagram->grid.visible_y);
+         else if (!strcmp(attr, "hguides")) {
+           int len = diagram->guides.nhguides;
+           PyObject *ret = PyTuple_New(len);
+           int i;
+           for (i = 0; i < len; i++)
+             PyTuple_SetItem(ret, i, PyFloat_FromDouble(diagram->guides.hguides[i]));
+           return ret;
+         } else if (diagram && !strcmp(attr, "vguides")) {
+           int len = diagram->guides.nvguides;
+           PyObject *ret = PyTuple_New(len);
+           int i;
+           for (i = 0; i < len; i++)
+             PyTuple_SetItem(ret, i, PyFloat_FromDouble(diagram->guides.vguides[i]));
+           return ret;
+         }
+       }
+      }
     }
 
     return Py_FindMethod(PyDiaDiagramData_Methods, (PyObject *)self, attr);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]