gcc-python-plugin finds its first bug in itself

David Malcolm dmalcolm@redhat.com
Fri Aug 5 17:08:00 GMT 2011


gcc-python-plugin [1] now provides a gcc-with-cpychecker harness that
runs gcc with an additional pass that checks CPython API calls
(internally, it's using the gcc python plugin to run a python script
that does the work).

I tried rebuilding the plugin using
  make CC=../other-build/gcc-with-cpychecker
and it found a genuine bug in itself: within this code:

   350	PyObject *
   351	gcc_Pass_get_by_name(PyObject *cls, PyObject *args, PyObject *kwargs)
   352	{
   353	    const char *name;
   354	    char *keywords[] = {"name",
   355	                        NULL};
   356	    struct opt_pass *result;
   357	
   358	    if (!PyArg_ParseTupleAndKeywords(args, kwargs,
   359	                                     "s|get_by_name", keywords,
   360	                                     &name)) {
   361	        return NULL;
   362	    }
   363  [...snip...]

it found this problem:

gcc-python-pass.c: In function ‘gcc_Pass_get_by_name’:
gcc-python-pass.c:358:37: error: unknown format char in "s|get_by_name": 'g' [-fpermissive]

It turned out that I'd typo-ed the format code: I was erroneously using
"|" (signifying that optional args follow), when I meant to use
":" (signifying that the rest of the string is the name of the function,
for use in error messages) [2].

Fixed in git; there are a few false positives, which I'm working on
fixing now.

I'm in two minds about whether this (minor) milestone is one I should
mention in public, but I guess it's proof that having a static checker
for this kind of mistake is worthwhile :)

Dave

[1] https://fedorahosted.org/gcc-python-plugin/

[2] fwiw, the API that it's checking is here:
http://docs.python.org/c-api/arg.html



More information about the Gcc mailing list