classification
Title: gcc 4.6 warnings
Type: Stage:
Components: Build Versions: Python 3.3
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: brett.cannon, jcea, kidanger, loewis, poolie, python-dev, serhiy.storchaka, terry.reedy, vstinner
Priority: normal Keywords: patch

Created on 2011-01-19 21:58 by vstinner, last changed 2013-04-24 11:36 by loewis. This issue is now closed.

Files
File name Uploaded Description Edit
20110822-1150-python-warnings.diff poolie, 2011-08-22 01:52 review
20110822-1352-gcc-warnings.diff poolie, 2011-08-22 03:57
fix_2warnings.diff kidanger, 2011-12-17 19:25 Fix two warnings review
Messages (17)
msg126571 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2011-01-19 21:58
To analyze #9880, I installed gcc-4.6. It looks like this new gcc version emits new warnings. Here is a report of py3k warnings generated with "gcc-4.6 -O3 -Wall -Wextra -Wstrict-prototypes -Wno-missing-field-initializers -Wno-unused-parameter" on AMD64. I grouped manually  the warnings.

sign-compare:

Parser/node.c: In function 'PyNode_AddChild':
Parser/node.c:94:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Objects/bytesobject.c: In function 'PyBytes_FromStringAndSize':
Objects/bytesobject.c:95:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Objects/floatobject.c: In function 'PyFloat_ClearFreeList':
Objects/floatobject.c:1960:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Objects/floatobject.c:1970:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Objects/floatobject.c: In function 'PyFloat_Fini':
Objects/floatobject.c:2014:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Objects/memoryobject.c: In function '_indirect_copy_nd':
Objects/memoryobject.c:199:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Objects/tupleobject.c: In function 'PyTuple_New':
Objects/tupleobject.c:85:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Objects/typeobject.c: In function 'PyType_FromSpec':
Objects/typeobject.c:2339:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Objects/unicodeobject.c: In function '_PyUnicode_New':
Objects/unicodeobject.c:326:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Objects/unicodeobject.c: In function 'PyUnicodeUCS2_AsWideCharString':
Objects/unicodeobject.c:1288:42: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Objects/unicodeobject.c: In function 'PyUnicodeUCS2_DecodeFSDefaultAndSize':
Objects/unicodeobject.c:1804:37: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Objects/unicodeobject.c: In function 'PyUnicodeUCS2_FSConverter':
Objects/unicodeobject.c:1851:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Objects/unicodeobject.c: In function 'PyUnicodeUCS2_FSDecoder':
Objects/unicodeobject.c:1892:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Objects/unicodeobject.c: In function 'PyUnicode_AsUnicodeCopy':
Objects/unicodeobject.c:10336:37: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Python/asdl.c: In function 'asdl_seq_new':
Python/asdl.c:12:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Python/asdl.c: In function 'asdl_int_seq_new':
Python/asdl.c:43:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Parser/printgrammar.c: In function 'printdfas':
Parser/printgrammar.c:96:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Parser/pgenmain.c: In function 'getgrammar':
Parser/pgenmain.c:102:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Python/bltinmodule.c: In function 'source_as_string':
Python/bltinmodule.c:528:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Python/getargs.c: In function 'convertsimple':
Python/getargs.c:876:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Python/getargs.c:993:43: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Python/pythonrun.c: In function 'print_error_text':
Python/pythonrun.c:1352:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
./Python/sysmodule.c: In function 'svnversion_init':
./Python/sysmodule.c:1367:9: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Python/traceback.c: In function '_Py_FindSourceFile':
Python/traceback.c:191:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Python/dtoa.c: In function 'Balloc':
Python/dtoa.c:349:56: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Python/thread_pthread.h: In function 'PyThread_create_key':
Python/thread_pthread.h:592:22: warning: signed and unsigned type in conditional expression [-Wsign-compare]
Python/compile.c: In function 'compiler_import_as':
Python/compile.c:2076:49: warning: signed and unsigned type in conditional expression [-Wsign-compare]
Python/compile.c: In function 'assemble_init':
Python/compile.c:3619:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

unused-but-set-variable:

Parser/parsetok.c: In function 'parsetok':
Parser/parsetok.c:130:43: warning: variable 'handling_with' set but not used [-Wunused-but-set-variable]
Objects/obmalloc.c: In function '_PyObject_DebugMallocStats':
Objects/obmalloc.c:1778:14: warning: variable 'poolsinarena' set but not used [-Wunused-but-set-variable]
Objects/unicodeobject.c: In function 'replace':
Objects/unicodeobject.c:6932:29: warning: variable 'e' set but not used [-Wunused-but-set-variable]
Python/bltinmodule.c: In function 'builtin___build_class__':
Python/bltinmodule.c:40:23: warning: variable 'nbases' set but not used [-Wunused-but-set-variable]
Python/bltinmodule.c: In function 'builtin_exec':
Python/bltinmodule.c:769:9: warning: variable 'plain' set but not used [-Wunused-but-set-variable]
./Python/sysmodule.c: In function 'PySys_AddXOption':
./Python/sysmodule.c:1179:9: warning: variable 'r' set but not used [-Wunused-but-set-variable]
Python/thread_pthread.h: In function 'PyThread_free_lock':
Python/thread_pthread.h:294:17: warning: variable 'error' set but not used [-Wunused-but-set-variable]
Python/thread_pthread.h: In function 'PyThread_acquire_lock_timed':
Python/thread_pthread.h:325:17: warning: variable 'error' set but not used [-Wunused-but-set-variable]
Python/thread_pthread.h: In function 'PyThread_release_lock':
Python/thread_pthread.h:376:17: warning: variable 'error' set but not used [-Wunused-but-set-variable]
./Modules/_sre.c: In function '_validate_inner':
./Modules/_sre.c:2988:42: warning: variable 'prefix_skip' set but not used [-Wunused-but-set-variable]
./Modules/_sre.c:2966:38: warning: variable 'max' set but not used [-Wunused-but-set-variable]
./Modules/_sre.c:2966:33: warning: variable 'min' set but not used [-Wunused-but-set-variable]
./Modules/_io/bytesio.c: In function 'bytesiobuf_getbuffer':
./Modules/_io/bytesio.c:941:11: warning: variable 'ptr' set but not used [-Wunused-but-set-variable]

empty-body:

Parser/pgen.c: In function 'compile_rule':
Parser/pgen.c:174:28: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
Parser/pgen.c: In function 'compile_rhs':
Parser/pgen.c:195:15: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
Parser/pgen.c:210:19: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
Parser/pgen.c: In function 'compile_alt':
Parser/pgen.c:228:15: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
Parser/pgen.c: In function 'compile_item':
Parser/pgen.c:250:15: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
Parser/pgen.c:253:19: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
Parser/pgen.c:262:19: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
Parser/pgen.c: In function 'compile_atom':
Parser/pgen.c:286:15: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
Parser/pgen.c:289:19: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]
./Modules/_sre.c: In function '_validate':
./Modules/_sre.c:3194:31: warning: suggest braces around empty body in an 'else' statement [-Wempty-body]

uninitialized:

Objects/setobject.c: In function 'test_c_api':
Objects/setobject.c:2445:11: warning: 'x' may be used uninitialized in this function [-Wuninitialized]
Python/Python-ast.c: In function 'obj2ast_expr':
Python/Python-ast.c:5824:24: warning: 'col_offset' may be used uninitialized in this function [-Wuninitialized]
Python/Python-ast.c:5824:24: warning: 'lineno' may be used uninitialized in this function [-Wuninitialized]
Python/Python-ast.c: In function 'obj2ast_stmt.part.15':
Python/Python-ast.c:4678:24: warning: 'col_offset' may be used uninitialized in this function [-Wuninitialized]
Python/Python-ast.c:4678:24: warning: 'lineno' may be used uninitialized in this function [-Wuninitialized]

(other):

./Python/sysmodule.c: In function 'svnversion_init':
./Python/sysmodule.c:1368:9: warning: offset outside bounds of constant string [enabled by default]
In file included from Python/thread.c:118:0:
msg126576 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2011-01-19 23:55
I took a look at an example of each type.

Sign-compare, Parser/node.c, 94
        if (required_capacity > PY_SIZE_MAX / sizeof(node))

I presume PY_SIZE_MAX and sizeof(node) are both unsigned.
So is, conceptually, required_capacity, but it is defined as an int because it is defined with XXXROUNDUP() and hence fancy_roundup(), which returns -1 if n1->n_nchildren is so large that the smallest power of 2 larger is too big for an int.

The comparison is 'OK' in context in that it is preceded by and guarded by
    if (current_capacity < 0 || required_capacity < 0)
        return E_OVERFLOW;

If I had written this, I might have thought about replacing all the comparisons with one check of n1->n_nchildren against some reasonable limit calculated from PY_SIZE_MAX / sizeof(node), and making both capacities unsigned.

---
Unused, Parser/parsetok.c, 130: local vars handling_with and handling_import are both set to 0 both here and again on line 157 and not seen elsewhere in the file. I presume both could just be deleted both places. 

---
Empty body, pgen, multiple places: those I checked are appearances of the REQN() macro. The REQ() macro did not generate a warning. 

#ifdef Py_DEBUG
#define REQN(i, count) \
    if (i < count) { \
        fprintf(stderr, REQNFMT, count); \
        Py_FatalError("REQN"); \
    } else
#else
#define REQN(i, count)  /* empty */
#endif

Since all invocations of REQN look like "     REQN(i, 1);", I presume the 'else' is there to swallow up the ';' which is added to make macro calls look like statements with a function call. I guess this is a style issue. As I remember, the suggestion to simply add '{}' to the macro would make syntax errors.

---
Uninitialized, Objects/setobject.c, 2445, in test_c_api: 
    while (_PySet_NextEntry((PyObject *)dup, &i, &x, &hash)) {
        s = _PyUnicode_AsString(x);

I presume x is set by _PySet... . (If i and hash are also, they are not used). So 'may be' but not actually.

---
Conclusion: the 'fix' is some real cleanup, some warning suppression.
msg127770 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2011-02-02 22:08
gcc 4.6 bug has been fixed (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47271). So setup.py can compile extensions using gcc 4.6, and here are new warnings:
---
building dbm using bdb
/home/haypo/prog/GIT/py3k/Modules/_pickle.c: In function 'load':
/home/haypo/prog/GIT/py3k/Modules/_pickle.c:5267:9: warning: case value '0' not in enumerated type 'enum opcode' [-Wswitch]
/home/haypo/prog/GIT/py3k/Modules/_csv.c: In function 'parse_grow_buff':
/home/haypo/prog/GIT/py3k/Modules/_csv.c:537:21: warning: operation on 'self->field' may be undefined [-Wsequence-point]
/home/haypo/prog/GIT/py3k/Modules/_csv.c: In function 'join_check_rec_size':
/home/haypo/prog/GIT/py3k/Modules/_csv.c:1058:23: warning: operation on 'self->rec' may be undefined [-Wsequence-point]
/home/haypo/prog/GIT/py3k/Modules/_posixsubprocess.c:4:0: warning: "_GNU_SOURCE" redefined [enabled by default]
./pyconfig.h:1151:0: note: this is the location of the previous definition
/home/haypo/prog/GIT/py3k/Modules/socketmodule.c: In function 'socket_gethostbyname_ex':
/home/haypo/prog/GIT/py3k/Modules/socketmodule.c:3318:9: warning: variable 'result' set but not used [-Wunused-but-set-variable]
/home/haypo/prog/GIT/py3k/Modules/socketmodule.c: In function 'socket_gethostbyaddr':
/home/haypo/prog/GIT/py3k/Modules/socketmodule.c:3396:9: warning: variable 'result' set but not used [-Wunused-but-set-variable]
/home/haypo/prog/GIT/py3k/Modules/_sqlite/connection.c: In function '_pysqlite_final_callback':
/home/haypo/prog/GIT/py3k/Modules/_sqlite/connection.c:676:15: warning: variable 'aggregate_class' set but not used [-Wunused-but-set-variable]
/home/haypo/prog/GIT/py3k/Modules/_sqlite/cursor.c: In function 'pysqlite_cursor_dealloc':
/home/haypo/prog/GIT/py3k/Modules/_sqlite/cursor.c:129:9: warning: variable 'rc' set but not used [-Wunused-but-set-variable]
/home/haypo/prog/GIT/py3k/Modules/_sqlite/statement.c: In function 'pysqlite_statement_dealloc':
/home/haypo/prog/GIT/py3k/Modules/_sqlite/statement.c:372:9: warning: variable 'rc' set but not used [-Wunused-but-set-variable]
/home/haypo/prog/GIT/py3k/Modules/_tkinter.c: In function 'PythonCmd':
/home/haypo/prog/GIT/py3k/Modules/_tkinter.c:2008:15: warning: variable 'self' set but not used [-Wunused-but-set-variable]
/home/haypo/prog/GIT/py3k/Modules/tkappinit.c: In function 'Tcl_AppInit':
/home/haypo/prog/GIT/py3k/Modules/tkappinit.c:29:15: warning: variable 'main_window' set but not used [-Wunused-but-set-variable]
(...)
/home/haypo/prog/GIT/py3k/Modules/_ctypes/cfield.c: In function 'PyCField_FromDesc':
/home/haypo/prog/GIT/py3k/Modules/_ctypes/cfield.c:55:29: warning: variable 'length' set but not used [-Wunused-but-set-variable]
/home/haypo/prog/GIT/py3k/Modules/_ctypes/libffi/src/dlmalloc.c: In function 'mmap_resize':
/home/haypo/prog/GIT/py3k/Modules/_ctypes/libffi/src/dlmalloc.c:3193:5: warning: implicit declaration of function 'mremap' [-Wimplicit-function-declaration]
/home/haypo/prog/GIT/py3k/Modules/_ctypes/libffi/src/dlmalloc.c:3193:16: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
/home/haypo/prog/GIT/py3k/Modules/_ctypes/libffi/src/dlmalloc.c: In function 'sys_trim':
/home/haypo/prog/GIT/py3k/Modules/_ctypes/libffi/src/dlmalloc.c:3612:62: warning: comparison between pointer and integer [enabled by default]
---
msg127776 - (view) Author: Brett Cannon (brett.cannon) * (Python committer) Date: 2011-02-02 23:01
Just a comment on those warnings about unused assignments; think about commenting them out instead of flat-out deleting them. When I ran clang over Python 2.7 I got some blow-back from deleting some assignments as some found them to be like documentation. In instances where the assignment helps explain what is going on it is best to just comment the code out.
msg128185 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2011-02-08 19:09
I can see how a comment like /* spam = eggs + ham */ could be useful, but and isolated /* foo = 0 */ where 'foo' appears nowhere else in the file seems more like confusing noise.
msg128186 - (view) Author: Brett Cannon (brett.cannon) * (Python committer) Date: 2011-02-08 19:14
You're right, Terry. It's a judgment call as to what should be simply deleted compared to commented out.
msg142654 - (view) Author: Martin Pool (poolie) Date: 2011-08-22 01:52
this fixes the pickle warnings, and cleans up some (I'm pretty sure) dead code in there.  the pickle tests all pass.
msg142665 - (view) Author: Martin Pool (poolie) Date: 2011-08-22 03:57
This fixes every compiler warning so that Python build with -Werror on Ubuntu Oneiric alpha (gcc 4.6.1-7ubuntu1).  

 * PyMem_Resize is a macro that mutates its first argument; the return value shouldn't be used.
 * Some variables in sre are (apparently harmlessly) not used when validating the opcodes.
 * gethostbyname_r return codes weren't used and should be; it is not guaranteed to set h_errno correctly (though it does seem to do so here)
 * a few vairables in pthread and tkappintr are not used in some preprocessor productions.
 * setup.py should detect linux kernel 3.0 as linux, and therefore able to build ossaudiodev

I don't get all the errors mentioned by haypo.  At least some seem already fixed.
msg142682 - (view) Author: Martin Pool (poolie) Date: 2011-08-22 06:16
My patch above fixes all the messages so that you get a clean build with the current makefile.

-Wuninitialized and 'offset outside constant string' would be worth fixing but I can't reproduce them in Python.

I'm personally not so keen on fixing all the signed/unsigned comparisons unless they're checked by the default build, because in my experience that has a pretty low payoff and some chance of introducing errors.
msg149698 - (view) Author: Jérémy Anger (kidanger) Date: 2011-12-17 19:25
I've fixed two more warnings, see my patch. (gcc 4.6.2)
msg149707 - (view) Author: Roundup Robot (python-dev) (Python triager) Date: 2011-12-17 21:38
New changeset d7862e855274 by Victor Stinner in branch '3.2':
Issue #10951: Fix a compiler warning in timemodule.c
http://hg.python.org/cpython/rev/d7862e855274

New changeset 49b85dba251d by Victor Stinner in branch 'default':
Issue #10951: Fix compiler warnings in timemodule.c and unicodeobject.c
http://hg.python.org/cpython/rev/49b85dba251d
msg155099 - (view) Author: Roundup Robot (python-dev) (Python triager) Date: 2012-03-07 17:08
New changeset 2f10c1ad4b21 by Ross Lagerwall in branch 'default':
Issue #10951: Fix warnings in the socket module.
http://hg.python.org/cpython/rev/2f10c1ad4b21

New changeset 1dd43e939c07 by Ross Lagerwall in branch 'default':
Issue #10951: Fix compiler warnings in _sre.c
http://hg.python.org/cpython/rev/1dd43e939c07
msg168590 - (view) Author: Martin v. Löwis (loewis) * (Python committer) Date: 2012-08-19 19:25
(As usual), I'm quite skeptical about this "bulk bug report"; it violates the "one bug at a time" principle, where "one bug" can roughly be defined as "cannot be split into smaller independent issues".

For the cases at hand, I think it would be best if somebody with gcc 4.6 available just fixed the "easy" ones, i.e. where the code clearly improves when silenciing the warning. In these cases, I wouldn't mind if they get checked in without code review; I know some favor review for all changes, in which case a separate issue should be opened for a patch fixing a bunch of these.

The more difficult ones may deserve their own issues (e.g. when it is debatable whether gcc is right to warn about the code)
msg171681 - (view) Author: Martin Pool (poolie) Date: 2012-09-30 22:58
Hi, Martin,

On 20 August 2012 05:25, Martin v. Löwis <report@bugs.python.org> wrote:
> Martin v. Löwis added the comment:
>
> (As usual), I'm quite skeptical about this "bulk bug report"; it violates the "one bug at a time" principle, where "one bug" can roughly be defined as "cannot be split into smaller independent issues".

I heartily agree with you in general: as well as being non-atomic,
it's also hard to have a clear test whether such bugs are fixed.  But,
I hope this patch has some value even if the bug is not a great
example.

> For the cases at hand, I think it would be best if somebody with gcc 4.6 available just fixed the "easy" ones, i.e. where the code clearly improves when silenciing the warning. In these cases, I wouldn't mind if they get checked in without code review; I know some favor review for all changes, in which case a separate issue should be opened for a patch fixing a bunch of these.

I've fixed what I believe to be all the safe/easy warnings in my patch
above.  I would appreciate if someone would review it and if possible
commit it.
msg178878 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2013-01-03 01:33
fix_2warnings.diff: I don't like statement like (void)err; to kill a compiler warning. I prefer GCC __attribute__((unused)) using a macro instead. About the change on unicode_fromascii, the code changed a lot since the patch was written. The patch is outdated and not really interesting. Please open a new issue with a new patch if there are remaining warnings.

I'm closing the issue because I agree with Martin von Loewis, it's better to open new issues for each warning (warning class?).
msg187667 - (view) Author: Serhiy Storchaka (serhiy.storchaka) * (Python committer) Date: 2013-04-23 19:24
What about backporting this fixes to 2.7?
msg187694 - (view) Author: Martin v. Löwis (loewis) * (Python committer) Date: 2013-04-24 11:36
I don't mind them being backported, in the spirit of supporting newer tools well in 2.7. OTOH, I don't see it as necessary, either. 2.7 will eventually be phased out, and then it doesn't matter how much warnings it produces.
History
Date User Action Args
2013-04-24 11:36:39loewissetmessages: + msg187694
2013-04-23 19:24:53serhiy.storchakasetnosy: + serhiy.storchaka
messages: + msg187667
2013-01-03 01:34:02vstinnersetstatus: open -> closed
resolution: fixed
2013-01-03 01:33:55vstinnersetmessages: + msg178878
2012-09-30 22:58:09pooliesetmessages: + msg171681
2012-08-19 19:25:21loewissetnosy: + loewis
messages: + msg168590
2012-03-07 17:08:20python-devsetmessages: + msg155099
2011-12-17 21:38:28python-devsetnosy: + python-dev
messages: + msg149707
2011-12-17 19:26:00kidangersetfiles: + fix_2warnings.diff
nosy: + kidanger
messages: + msg149698

2011-08-22 06:16:33pooliesetmessages: + msg142682
2011-08-22 03:57:38pooliesetfiles: + 20110822-1352-gcc-warnings.diff

messages: + msg142665
2011-08-22 01:52:18pooliesetfiles: + 20110822-1150-python-warnings.diff

nosy: + poolie
messages: + msg142654

keywords: + patch
2011-02-08 19:14:04brett.cannonsetnosy: brett.cannon, terry.reedy, jcea, vstinner
messages: + msg128186
2011-02-08 19:09:54terry.reedysetnosy: brett.cannon, terry.reedy, jcea, vstinner
messages: + msg128185
2011-02-02 23:01:02brett.cannonsetnosy: brett.cannon, terry.reedy, jcea, vstinner
messages: + msg127776
2011-02-02 22:08:49vstinnersetnosy: brett.cannon, terry.reedy, jcea, vstinner
messages: + msg127770
2011-01-20 02:28:31jceasetnosy: + jcea
2011-01-19 23:55:06terry.reedysetnosy: + terry.reedy
messages: + msg126576
2011-01-19 22:00:57brett.cannonsetnosy: + brett.cannon
2011-01-19 21:58:50vstinnersetcomponents: + Build
versions: + Python 3.3
2011-01-19 21:58:33vstinnercreate