0.10¶
Thanks to Buck Golemon, Daniele Varrazzo, David Narvaez, Eevee, Jason Mueller, Kevin Pyle, Matt Rice and Tom Tromey for their contributions to this release.
Changes to the GCC Python Plugin¶
- The plugin can now be used with Python 3.3 (fixing Unicode issues and dict-ordering assumptions).
- The plugin now exposes inline assembler to Python scripts via
gcc.GimpleAsm
. - There is a new gccutils.sorted_callgraph() function to get the callgraph in topologically-sorted order.
- The test suite has been reworked to fix issues with checkouts on OS X case-insensitive filesystems.
- C++ support: support for locating the global namespace (aka “::”), for locating declarations and child namespaces within a namespace, and aliases.
gcc.Declaration
now has an is_builtin attribute- Numerous improvements to the plugin’s Makefile
Improvements to gcc-with-cpychecker¶
By default, the refcount checker is now only run on code that includes <Python.h> (implemented by checking if the “PyObject” typedef exists).
This greatly speeds up compilation of large projects for which the Python extension modules are only a small subset of the source tree.
Added some custom attributes for marking functions that set an exception, either always, or when returning a negative value:
__attribute__((cpychecker_negative_result_sets_exception)) __attribute__((cpychecker_sets_exception))
Improve descriptions of ranges: rather than emitting descriptions with the rather vague “value”, such as:
when considering range: 1 <= value <= 0x7fffffff
instead try to embed a descriptive name for the value, such as:
when considering range: 1 <= n <= 0x7fffffff
Mass recompile of Fedora 17’s Python extension code¶
I ran the reference-count checker on all of the C/C++ Python extension modules in Fedora 17 and reported hundreds of genuine problems, many of which have been fixed.
In the process of doing this I found and fixed many problems in the checker itself. For example:
the checker now understand’s GCC’s __builtin_expect, fixing various false reports about dereferencing NULL pointers when running the checker on Cython-generated code in python-lxml-2.3
added descriptions of part of SWIG and Cython’s internal APIs to suppress some false positives seen with SWIG and Cython-generated code.
tweak the refcount rules to fix some false positives where the checker erroneously considered the case of a deallocation by:
Py_DECREF(obj);where “obj” provably had other references not owned by the function being analyzed, and thus for the case where obj->ob_refcnt > 1 the deallocation could not happen.
The plugin also now has a triaging script which can examine all of the errors within a build and provide a report, showing all of them in prioritized categories.
The source tree now contains helper scripts for conducting such a mass recompile.
Pyscopg support¶
Daniele Varrazzo used the checker extensively on psycopg, the popular Python interface to PostgreSQL, and was able to find and fix numerous subtle errors:
Experimental new error visualization¶
The checker can now dump its internal representation in JSON form, via a new –dump-json option, and an experimental new renderer can generate HTML from this. An example can be seen here:
http://fedorapeople.org/~dmalcolm/gcc-python-plugin/2012-03-19/example/example.html
This is still a work-in-progress
C++ support¶
The checker is now able to run on C++ code: support has been added for methods,
references, “this”, destructors, the gcc.GimpleNop
operation.
Coverage of the CPython API¶
The format code handling for Py_BuildValue was missing support for the following codes:
- ‘u’ and ‘u#’
- ‘f’ and ‘d’
- ‘D’
- ‘c’
In addition, the handling for ‘s#’ and ‘z#’ had a bug in which it erroneously expected an int* or Py_ssize_t*, rather than just a int or Py_ssize_t.
This release fixes these issues, and gives full coverage of all valid format codes for Py_BuildValue in Python 2.
This release adds heuristics for the behavior of the following CPython API entrypoints:
- PyCode_New
- PyCObject_FromVoidPtrAndDesc
- PyDict_Size
- PyErr_Clear
- PyEval_CallMethod
- Py_FatalError
- PyFile_SoftSpace, PyFile_WriteObject, and PyFile_WriteString
- PyFloat_AsDouble and PyFloat_FromDouble
- PyFrame_New
- Py_GetVersion
- PyImport_AddModule
- PyIter_Next
- PyNumber_Int, PyNumber_Remainder
- PyObject_CallObject, PyObject_GetAttr, PyObject_GetAttrString, PyObject_GetItem, PyObject_SetAttr, and PyObject_SetAttrString
- PyOS_snprintf
- PyString_InternFromString
- PySequence_Concat, PySequence_GetSlice, PySequence_SetItem, PySequence_Size
- PySys_GetObject
- PyTraceBack_Here
- PyTuple_GetItem
- PyUnicodeUCS4_DecodeUTF8
- PyWeakref_GetObject
along with various other bugfixes.