https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107646

--- Comment #10 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Eric Feng <ef...@gcc.gnu.org>:

https://gcc.gnu.org/g:597b9ec69bca8acb7a3d65641c0a730de8b27ed4

commit r14-3580-g597b9ec69bca8acb7a3d65641c0a730de8b27ed4
Author: Eric Feng <ef2...@columbia.edu>
Date:   Wed Aug 30 17:52:24 2023 -0400

    analyzer: implement reference count checking for CPython plugin [PR107646]

    This patch introduces initial support for reference count checking of
    PyObjects in relation to the Python/C API for the CPython plugin.
    Additionally, the core analyzer underwent several modifications to
    accommodate this feature. These include:

    - Introducing support for callbacks at the end of
      region_model::pop_frame. This is our current point of validation for
      the reference count of PyObjects.
    - An added optional custom stmt_finder parameter to
      region_model_context::warn. This aids in emitting a diagnostic
      concerning the reference count, especially when the stmt_finder is
      NULL, which is currently the case during region_model::pop_frame.

    The current diagnostic we emit relating to the reference count
    appears as follows:

    rc3.c:23:10: warning: expected âitemâ to have reference count: â1â
but
    ob_refcnt field is: â2â
       23 |   return list;
          |          ^~~~
      âcreate_py_objectâ: events 1-4
        |
        |    4 |   PyObject* item = PyLong_FromLong(3);
        |      |                    ^~~~~~~~~~~~~~~~~~
        |      |                    |
        |      |                    (1) when âPyLong_FromLongâ succeeds
        |    5 |   PyObject* list = PyList_New(1);
        |      |                    ~~~~~~~~~~~~~
        |      |                    |
        |      |                    (2) when âPyList_Newâ succeeds
        |......
        |   14 |   PyList_Append(list, item);
        |      |   ~~~~~~~~~~~~~~~~~~~~~~~~~
        |      |   |
        |      |   (3) when âPyList_Appendâ succeeds, moving buffer
        |......
        |   23 |   return list;
        |      |          ~~~~
        |      |          |
        |      |          (4) here
        |

    This is a WIP in several ways:
    - Currently, functions returning PyObject * are assumed to always
      produce a new reference.
    - The validation of reference count is only for PyObjects created within
      a function body. Verifying reference counts for PyObjects passed as
      parameters is not supported in this patch.

    gcc/analyzer/ChangeLog:
            PR analyzer/107646
            * engine.cc (impl_region_model_context::warn): New optional
            parameter.
            * exploded-graph.h (class impl_region_model_context): Likewise.
            * region-model.cc (region_model::pop_frame): New callback
            feature for region_model::pop_frame.
            * region-model.h (struct append_regions_cb_data): Likewise.
            (class region_model): Likewise.
            (class region_model_context): New optional parameter.
            (class region_model_context_decorator): Likewise.

    gcc/testsuite/ChangeLog:
            PR analyzer/107646
            * gcc.dg/plugin/analyzer_cpython_plugin.c: Implements reference
            count checking for PyObjects.
            * gcc.dg/plugin/cpython-plugin-test-2.c: Moved to...
            * gcc.dg/plugin/cpython-plugin-test-PyList_Append.c: ...here
            (and added more tests).
            * gcc.dg/plugin/cpython-plugin-test-1.c: Moved to...
            * gcc.dg/plugin/cpython-plugin-test-no-Python-h.c: ...here (and
            added more tests).
            * gcc.dg/plugin/plugin.exp: New tests.
            * gcc.dg/plugin/cpython-plugin-test-PyList_New.c: New test.
            * gcc.dg/plugin/cpython-plugin-test-PyLong_FromLong.c: New test.

    Signed-off-by: Eric Feng <ef2...@columbia.edu>

Reply via email to