[dia] [scan-build] Result of operation is garbage or undefined (not!)
- From: Hans Breuer <hans src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] [scan-build] Result of operation is garbage or undefined (not!)
- Date: Mon, 9 Jun 2014 08:48:16 +0000 (UTC)
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]