[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gcc-python-plugin-commits
Subject:    [gcc-python-plugin] cpychecker: implement PySequence_SetItem
From:       dmalcolm () fedoraproject ! org (dmalcolm)
Date:       2012-02-27 17:01:17
Message-ID: 20120227170117.F01671529 () lists ! fedorahosted ! org
[Download RAW message or body]

commit 2f093468d53f9a6f20242c426d8357a48cacc2d8
Author: Daniele Varrazzo <daniele.varrazzo at gmail.com>
Date:   Mon Feb 27 11:57:18 2012 -0500

    cpychecker: implement PySequence_SetItem

 libcpychecker/refcounts.py                         |   29 ++++
 .../refcounts/PySequence_SetItem/correct/input.c   |   64 +++++++++
 .../refcounts/PySequence_SetItem/correct/script.py |   22 +++
 .../PySequence_SetItem/correct/stdout.txt          |  146 ++++++++++++++++++++
 .../refcounts/PySequence_SetItem/incorrect/input.c |   63 +++++++++
 .../PySequence_SetItem/incorrect/metadata.ini      |    3 +
 .../PySequence_SetItem/incorrect/script.py         |   22 +++
 .../PySequence_SetItem/incorrect/stderr.txt        |   17 +++
 .../PySequence_SetItem/incorrect/stdout.txt        |  111 +++++++++++++++
 9 files changed, 477 insertions(+), 0 deletions(-)
---
diff --git a/libcpychecker/refcounts.py b/libcpychecker/refcounts.py
index c49a48e..1f6e08e 100644
--- a/libcpychecker/refcounts.py
+++ b/libcpychecker/refcounts.py
@@ -2723,6 +2723,35 @@ class CPython(Facet):
                                                          fnmeta,
                                                          'new ref from %s' % \
fnmeta.name)  
+    def impl_PySequence_SetItem(self, stmt, v_o, v_i, v_item):
+        fnmeta = FnMeta(name='PySequence_SetItem',
+                        prototype='int PySequence_SetItem(PyObject *o, Py_ssize_t i, \
PyObject *item)', +                        \
docurl='http://docs.python.org/c-api/sequence.html#PySequence_SetItem', +             \
defined_in='Objects/abstract.c') +        # safely handles NULL for the obj via \
null_error(): +        t_err = self.handle_null_error(stmt, 0, v_o, \
rawreturnvalue=-1) +        if t_err:
+            return [t_err]
+
+        result = []
+
+        s_success  = self.state.mkstate_concrete_return_of(stmt, 0)
+        # The function *doesn't* steal a reference to item
+
+        # For now, this only covers the "success" case.  The call can fail
+        # returning -1:
+        #   * raising TypeError if passed a non-sequence, or if the type's
+        #     PySequenceMethods table lacks a sq_ass_item callback
+        #   * if the call to sq_length fails, propagating some exception
+        #   * if the call to sq_ass_item fails, propagating some exception
+        # but we don't track these possibilities yet.
+
+        result.append(Transition(self.state,
+                                 s_success,
+                                 '%s() succeeds' % fnmeta.name))
+
+        return result
+
     ########################################################################
     # PyString_*
     ########################################################################
diff --git a/tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c \
b/tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c new file mode 100644
index 0000000..7f19a5d
--- /dev/null
+++ b/tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c
@@ -0,0 +1,64 @@
+/*
+   Copyright 2011 David Malcolm <dmalcolm at redhat.com>
+   Copyright 2011 Red Hat, Inc.
+
+   This is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see
+   <http://www.gnu.org/licenses/>.
+*/
+
+#include <Python.h>
+
+PyObject *
+handle_SetItem(PyObject *self, PyObject *args)
+{
+    PyObject *list;
+    PyObject *item;
+    int rv;
+
+    list = PyList_New(1);
+    if (!list) {
+        return NULL;
+    }
+
+    item = PyLong_FromLong(42);
+    if (!item) {
+        Py_DECREF(list);
+        return NULL;
+    }
+
+    /* Set the item in the list via PySequence_SetItem() */
+    rv = PySequence_SetItem(list, 0, item);
+    if (rv != 0) {
+        Py_DECREF(list);
+        Py_DECREF(item);
+        return NULL;
+    }
+
+    /* the function doesn't steal a ref, so leaving item here would be a leak */
+    Py_DECREF(item);
+
+    return list;
+}
+static PyMethodDef test_methods[] = {
+    {"test_method",  handle_SetItem, METH_VARARGS, NULL},
+    {NULL, NULL, 0, NULL} /* Sentinel */
+};
+
+/*
+  PEP-7
+Local variables:
+c-basic-offset: 4
+indent-tabs-mode: nil
+End:
+*/
diff --git a/tests/cpychecker/refcounts/PySequence_SetItem/correct/script.py \
b/tests/cpychecker/refcounts/PySequence_SetItem/correct/script.py new file mode \
100644 index 0000000..6bb62fd
--- /dev/null
+++ b/tests/cpychecker/refcounts/PySequence_SetItem/correct/script.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+#   Copyright 2011 David Malcolm <dmalcolm at redhat.com>
+#   Copyright 2011 Red Hat, Inc.
+#
+#   This is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by
+#   the Free Software Foundation, either version 3 of the License, or
+#   (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#   General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program.  If not, see
+#   <http://www.gnu.org/licenses/>.
+
+from libcpychecker import main
+
+main(verify_refcounting=True,
+     dump_traces=True)
diff --git a/tests/cpychecker/refcounts/PySequence_SetItem/correct/stdout.txt \
b/tests/cpychecker/refcounts/PySequence_SetItem/correct/stdout.txt new file mode \
100644 index 0000000..f4988aa
--- /dev/null
+++ b/tests/cpychecker/refcounts/PySequence_SetItem/correct/stdout.txt
@@ -0,0 +1,146 @@
+Trace 0:
+  Transitions:
+    'when PyList_New() succeeds'
+    'taking False path'
+    'when PyLong_FromLong() succeeds'
+    'taking False path'
+    'PySequence_SetItem() succeeds'
+    'taking False path'
+    'when taking True path'
+    'returning'
+  Return value:
+    repr(): PointerToRegion(gcctype='struct PyObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=29), region=RegionOnHeap('PyListObject', \
gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=29))) +    str(): (struct PyObject *)&RegionOnHeap('PyListObject', \
gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=29)) from tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:29 +    \
r->ob_refcnt: refs: 1 + N where N >= 0 +    r->ob_type: \
PointerToRegion(gcctype='struct PyTypeObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=29), region=RegionForGlobal(gcc.VarDecl('PyList_Type'))) +  \
Region("region-for-arg-gcc.ParmDecl('self')"): +    repr(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    str(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    r->ob_refcnt: refs: 0 + N where N \
>= 1 +    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
> loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
> line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('self')"))
+  Region("region-for-arg-gcc.ParmDecl('args')"):
+    repr(): Region("region-for-arg-gcc.ParmDecl('args')")
+    str(): Region("region-for-arg-gcc.ParmDecl('args')")
+    r->ob_refcnt: refs: 0 + N where N >= 1
+    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('args')")) +  \
PyLongObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:34: +    repr(): \
RegionOnHeap('PyLongObject', \
gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=34)) +    str(): PyLongObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:34 +    r->ob_refcnt: \
refs: 0 + N where N >= 0 +    r->ob_type: PointerToRegion(gcctype='struct \
PyTypeObject *', loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=34), region=RegionForGlobal(gcc.VarDecl('PyLong_Type'))) +  Exception:
+    (struct PyObject *)0 from \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:24 +
+Trace 1:
+  Transitions:
+    'when PyList_New() succeeds'
+    'taking False path'
+    'when PyLong_FromLong() succeeds'
+    'taking False path'
+    'PySequence_SetItem() succeeds'
+    'taking False path'
+    'when taking False path'
+    'calling tp_dealloc on PyLongObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:34' +    'returning'
+  Return value:
+    repr(): PointerToRegion(gcctype='struct PyObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=29), region=RegionOnHeap('PyListObject', \
gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=29))) +    str(): (struct PyObject *)&RegionOnHeap('PyListObject', \
gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=29)) from tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:29 +    \
r->ob_refcnt: refs: 1 + N where N >= 0 +    r->ob_type: \
PointerToRegion(gcctype='struct PyTypeObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=29), region=RegionForGlobal(gcc.VarDecl('PyList_Type'))) +  \
Region("region-for-arg-gcc.ParmDecl('self')"): +    repr(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    str(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    r->ob_refcnt: refs: 0 + N where N \
>= 1 +    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
> loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
> line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('self')"))
+  Region("region-for-arg-gcc.ParmDecl('args')"):
+    repr(): Region("region-for-arg-gcc.ParmDecl('args')")
+    str(): Region("region-for-arg-gcc.ParmDecl('args')")
+    r->ob_refcnt: refs: 0 + N where N >= 1
+    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('args')")) +  \
PyLongObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:34: +    repr(): \
RegionOnHeap('PyLongObject', \
gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=34)) +    str(): PyLongObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:34 +    r->ob_refcnt: \
None +    r->ob_type: None
+  Exception:
+    (struct PyObject *)0 from \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:24 +
+Trace 2:
+  Transitions:
+    'when PyList_New() succeeds'
+    'taking False path'
+    'when PyLong_FromLong() fails'
+    'taking True path'
+    'when taking True path'
+    'returning'
+  Return value:
+    repr(): ConcreteValue(gcctype='struct PyObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=37), value=0) +    str(): (struct PyObject *)0 from \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:37 +  \
Region("region-for-arg-gcc.ParmDecl('self')"): +    repr(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    str(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    r->ob_refcnt: refs: 0 + N where N \
>= 1 +    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
> loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
> line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('self')"))
+  Region("region-for-arg-gcc.ParmDecl('args')"):
+    repr(): Region("region-for-arg-gcc.ParmDecl('args')")
+    str(): Region("region-for-arg-gcc.ParmDecl('args')")
+    r->ob_refcnt: refs: 0 + N where N >= 1
+    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('args')")) +  \
PyListObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:29: +    repr(): \
RegionOnHeap('PyListObject', \
gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=29)) +    str(): PyListObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:29 +    r->ob_refcnt: \
refs: 0 + N where N >= 0 +    r->ob_type: PointerToRegion(gcctype='struct \
PyTypeObject *', loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=29), region=RegionForGlobal(gcc.VarDecl('PyList_Type'))) +  Exception:
+    (struct PyObject *)&RegionForGlobal(gcc.VarDecl('PyExc_MemoryError')) from \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:34 +
+Trace 3:
+  Transitions:
+    'when PyList_New() succeeds'
+    'taking False path'
+    'when PyLong_FromLong() fails'
+    'taking True path'
+    'when taking False path'
+    'calling tp_dealloc on PyListObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:29' +    'returning'
+  Return value:
+    repr(): ConcreteValue(gcctype='struct PyObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=37), value=0) +    str(): (struct PyObject *)0 from \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:37 +  \
Region("region-for-arg-gcc.ParmDecl('self')"): +    repr(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    str(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    r->ob_refcnt: refs: 0 + N where N \
>= 1 +    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
> loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
> line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('self')"))
+  Region("region-for-arg-gcc.ParmDecl('args')"):
+    repr(): Region("region-for-arg-gcc.ParmDecl('args')")
+    str(): Region("region-for-arg-gcc.ParmDecl('args')")
+    r->ob_refcnt: refs: 0 + N where N >= 1
+    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('args')")) +  \
PyListObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:29: +    repr(): \
RegionOnHeap('PyListObject', \
gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=29)) +    str(): PyListObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:29 +    r->ob_refcnt: \
None +    r->ob_type: None
+  Exception:
+    (struct PyObject *)&RegionForGlobal(gcc.VarDecl('PyExc_MemoryError')) from \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:34 +
+Trace 4:
+  Transitions:
+    'when PyList_New() fails'
+    'taking True path'
+    'returning'
+  Return value:
+    repr(): ConcreteValue(gcctype='struct PyObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=31), value=0) +    str(): (struct PyObject *)0 from \
tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:31 +  \
Region("region-for-arg-gcc.ParmDecl('self')"): +    repr(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    str(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    r->ob_refcnt: refs: 0 + N where N \
>= 1 +    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
> loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
> line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('self')"))
+  Region("region-for-arg-gcc.ParmDecl('args')"):
+    repr(): Region("region-for-arg-gcc.ParmDecl('args')")
+    str(): Region("region-for-arg-gcc.ParmDecl('args')")
+    r->ob_refcnt: refs: 0 + N where N >= 1
+    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c', \
line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('args')")) +  Exception:
+    (struct PyObject *)&RegionForGlobal(gcc.VarDecl('PyExc_MemoryError')) from \
                tests/cpychecker/refcounts/PySequence_SetItem/correct/input.c:29
diff --git a/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c \
b/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c new file mode \
100644 index 0000000..fb8ba36
--- /dev/null
+++ b/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c
@@ -0,0 +1,63 @@
+/*
+   Copyright 2011 David Malcolm <dmalcolm at redhat.com>
+   Copyright 2011 Red Hat, Inc.
+
+   This is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see
+   <http://www.gnu.org/licenses/>.
+*/
+
+#include <Python.h>
+
+PyObject *
+handle_SetItem(PyObject *self, PyObject *args)
+{
+    PyObject *list;
+    PyObject *item;
+    int rv;
+
+    list = PyList_New(1);
+    if (!list) {
+        return NULL;
+    }
+
+    item = PyLong_FromLong(42);
+    if (!item) {
+        Py_DECREF(list);
+        return NULL;
+    }
+
+    /* Set the item in the list via PySequence_SetItem() */
+    rv = PySequence_SetItem(list, 0, item);
+    if (rv != 0) {
+        Py_DECREF(list);
+        Py_DECREF(item);
+        return NULL;
+    }
+
+    /* ERROR: we are still keeping a reference on item */
+
+    return list;
+}
+static PyMethodDef test_methods[] = {
+    {"test_method",  handle_SetItem, METH_VARARGS, NULL},
+    {NULL, NULL, 0, NULL} /* Sentinel */
+};
+
+/*
+  PEP-7
+Local variables:
+c-basic-offset: 4
+indent-tabs-mode: nil
+End:
+*/
diff --git a/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/metadata.ini \
b/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/metadata.ini new file mode \
100644 index 0000000..0d5711c
--- /dev/null
+++ b/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/metadata.ini
@@ -0,0 +1,3 @@
+[ExpectedBehavior]
+# We expect only compilation *warnings*, so we expect a 0 exit code
+exitcode = 0
diff --git a/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/script.py \
b/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/script.py new file mode \
100644 index 0000000..6bb62fd
--- /dev/null
+++ b/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/script.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+#   Copyright 2011 David Malcolm <dmalcolm at redhat.com>
+#   Copyright 2011 Red Hat, Inc.
+#
+#   This is free software: you can redistribute it and/or modify it
+#   under the terms of the GNU General Public License as published by
+#   the Free Software Foundation, either version 3 of the License, or
+#   (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful, but
+#   WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#   General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program.  If not, see
+#   <http://www.gnu.org/licenses/>.
+
+from libcpychecker import main
+
+main(verify_refcounting=True,
+     dump_traces=True)
diff --git a/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/stderr.txt \
b/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/stderr.txt new file mode \
100644 index 0000000..bcaf1f1
--- /dev/null
+++ b/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/stderr.txt
@@ -0,0 +1,17 @@
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c: In function \
'handle_SetItem': +tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:51:nn: \
warning: ob_refcnt of '*item' is 1 too high [enabled by default] \
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:51:nn: note: was \
expecting final ob_refcnt to be N + 0 (for some unknown N) \
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:51:nn: note: but \
final ob_refcnt is N + 1 \
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:34:nn: note: \
PyLongObject allocated at:     item = PyLong_FromLong(42); \
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:29:nn: note: when \
PyList_New() succeeds at:     list = PyList_New(1); \
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:30:nn: note: taking \
False path at:     if (!list) { \
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:34:nn: note: \
reaching:     item = PyLong_FromLong(42); \
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:34:nn: note: when \
PyLong_FromLong() succeeds at:     item = PyLong_FromLong(42); \
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:34:nn: note: \
ob_refcnt is now refs: 1 + N where N >= 0 \
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:35:nn: note: taking \
False path at:     if (!item) { \
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:41:nn: note: \
reaching:     rv = PySequence_SetItem(list, 0, item); \
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:41:nn: note: \
PySequence_SetItem() succeeds at:     rv = PySequence_SetItem(list, 0, item); \
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:42:nn: note: taking \
False path at:     if (rv != 0) { \
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:50:nn: note: \
reaching:     return list; \
+tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:51:nn: note: \
returning +tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:24:nn: \
note: graphical error report for function 'handle_SetItem' written out to \
'tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c.handle_SetItem-refcount-errors.html'
                
diff --git a/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/stdout.txt \
b/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/stdout.txt new file mode \
100644 index 0000000..5f20363
--- /dev/null
+++ b/tests/cpychecker/refcounts/PySequence_SetItem/incorrect/stdout.txt
@@ -0,0 +1,111 @@
+Trace 0:
+  Transitions:
+    'when PyList_New() succeeds'
+    'taking False path'
+    'when PyLong_FromLong() succeeds'
+    'taking False path'
+    'PySequence_SetItem() succeeds'
+    'taking False path'
+    'returning'
+  Return value:
+    repr(): PointerToRegion(gcctype='struct PyObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=29), region=RegionOnHeap('PyListObject', \
gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=29))) +    str(): (struct PyObject *)&RegionOnHeap('PyListObject', \
gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=29)) from tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:29 +   \
r->ob_refcnt: refs: 1 + N where N >= 0 +    r->ob_type: \
PointerToRegion(gcctype='struct PyTypeObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=29), region=RegionForGlobal(gcc.VarDecl('PyList_Type'))) +  \
Region("region-for-arg-gcc.ParmDecl('self')"): +    repr(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    str(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    r->ob_refcnt: refs: 0 + N where N \
>= 1 +    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
> loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
> line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('self')"))
+  Region("region-for-arg-gcc.ParmDecl('args')"):
+    repr(): Region("region-for-arg-gcc.ParmDecl('args')")
+    str(): Region("region-for-arg-gcc.ParmDecl('args')")
+    r->ob_refcnt: refs: 0 + N where N >= 1
+    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('args')")) +  \
PyLongObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:34: +    repr(): \
RegionOnHeap('PyLongObject', \
gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=34)) +    str(): PyLongObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:34 +    r->ob_refcnt: \
refs: 1 + N where N >= 0 +    r->ob_type: PointerToRegion(gcctype='struct \
PyTypeObject *', loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=34), region=RegionForGlobal(gcc.VarDecl('PyLong_Type'))) +  Exception:
+    (struct PyObject *)0 from \
tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:24 +
+Trace 1:
+  Transitions:
+    'when PyList_New() succeeds'
+    'taking False path'
+    'when PyLong_FromLong() fails'
+    'taking True path'
+    'when taking True path'
+    'returning'
+  Return value:
+    repr(): ConcreteValue(gcctype='struct PyObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=37), value=0) +    str(): (struct PyObject *)0 from \
tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:37 +  \
Region("region-for-arg-gcc.ParmDecl('self')"): +    repr(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    str(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    r->ob_refcnt: refs: 0 + N where N \
>= 1 +    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
> loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
> line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('self')"))
+  Region("region-for-arg-gcc.ParmDecl('args')"):
+    repr(): Region("region-for-arg-gcc.ParmDecl('args')")
+    str(): Region("region-for-arg-gcc.ParmDecl('args')")
+    r->ob_refcnt: refs: 0 + N where N >= 1
+    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('args')")) +  \
PyListObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:29: +    repr(): \
RegionOnHeap('PyListObject', \
gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=29)) +    str(): PyListObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:29 +    r->ob_refcnt: \
refs: 0 + N where N >= 0 +    r->ob_type: PointerToRegion(gcctype='struct \
PyTypeObject *', loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=29), region=RegionForGlobal(gcc.VarDecl('PyList_Type'))) +  Exception:
+    (struct PyObject *)&RegionForGlobal(gcc.VarDecl('PyExc_MemoryError')) from \
tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:34 +
+Trace 2:
+  Transitions:
+    'when PyList_New() succeeds'
+    'taking False path'
+    'when PyLong_FromLong() fails'
+    'taking True path'
+    'when taking False path'
+    'calling tp_dealloc on PyListObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:29' +    'returning'
+  Return value:
+    repr(): ConcreteValue(gcctype='struct PyObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=37), value=0) +    str(): (struct PyObject *)0 from \
tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:37 +  \
Region("region-for-arg-gcc.ParmDecl('self')"): +    repr(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    str(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    r->ob_refcnt: refs: 0 + N where N \
>= 1 +    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
> loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
> line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('self')"))
+  Region("region-for-arg-gcc.ParmDecl('args')"):
+    repr(): Region("region-for-arg-gcc.ParmDecl('args')")
+    str(): Region("region-for-arg-gcc.ParmDecl('args')")
+    r->ob_refcnt: refs: 0 + N where N >= 1
+    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('args')")) +  \
PyListObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:29: +    repr(): \
RegionOnHeap('PyListObject', \
gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=29)) +    str(): PyListObject allocated at \
tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:29 +    r->ob_refcnt: \
None +    r->ob_type: None
+  Exception:
+    (struct PyObject *)&RegionForGlobal(gcc.VarDecl('PyExc_MemoryError')) from \
tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:34 +
+Trace 3:
+  Transitions:
+    'when PyList_New() fails'
+    'taking True path'
+    'returning'
+  Return value:
+    repr(): ConcreteValue(gcctype='struct PyObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=31), value=0) +    str(): (struct PyObject *)0 from \
tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:31 +  \
Region("region-for-arg-gcc.ParmDecl('self')"): +    repr(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    str(): \
Region("region-for-arg-gcc.ParmDecl('self')") +    r->ob_refcnt: refs: 0 + N where N \
>= 1 +    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
> loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
> line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('self')"))
+  Region("region-for-arg-gcc.ParmDecl('args')"):
+    repr(): Region("region-for-arg-gcc.ParmDecl('args')")
+    str(): Region("region-for-arg-gcc.ParmDecl('args')")
+    r->ob_refcnt: refs: 0 + N where N >= 1
+    r->ob_type: PointerToRegion(gcctype='struct PyTypeObject *', \
loc=gcc.Location(file='tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c', \
line=23), region=Region("region-for-type-of-arg-gcc.ParmDecl('args')")) +  Exception:
+    (struct PyObject *)&RegionForGlobal(gcc.VarDecl('PyExc_MemoryError')) from \
tests/cpychecker/refcounts/PySequence_SetItem/incorrect/input.c:29


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic