* Uncomment the lines in Misc/valgrind-python.supp that
suppress the warnings for PyObject_Free and PyObject_Realloc
+If you want to use Valgrind more effectively and catch even more
+memory leaks, you will need to configure python --without-pymalloc.
+PyMalloc allocates a few blocks in big chunks and most object
+allocations don't call malloc, they use chunks doled about by PyMalloc
+from the big blocks. This means Valgrind can't detect
+many allocations (and frees), except for those that are forwarded
+to the system malloc. Note: configuring python --without-pymalloc
+makes Python run much slower, especially when running under Valgrind.
+You may need to run the tests in batches under Valgrind to keep
+the memory usage down to allow the tests to complete. It seems to take
+about 5 times longer to run --without-pymalloc.
+
+
Details:
--------
Python uses its own small-object allocation scheme on top of malloc,
Starting with Python 2.3, PyMalloc is used by default. You can disable
PyMalloc when configuring python by adding the --without-pymalloc option.
If you disable PyMalloc, most of the information in this document and
-the supplied suppressions file will not be useful.
+the supplied suppressions file will not be useful. As discussed above,
+disabling PyMalloc can catch more problems.
If you use valgrind on a default build of Python, you will see
many errors like:
return NULL;
}
- if (asdl_seq_LEN(t) == 1)
+ if (asdl_seq_LEN(t) == 1) {
lc = comprehension(asdl_seq_GET(t, 0), expression, NULL);
+ /* only free the sequence since we grabbed element 0 above */
+ if (lc)
+ asdl_seq_free(t); /* ok */
+ }
else
lc = comprehension(Tuple(t, Store, LINENO(ch)), expression, NULL);
return NULL;
}
- if (asdl_seq_LEN(t) == 1)
+ if (asdl_seq_LEN(t) == 1) {
ge = comprehension(asdl_seq_GET(t, 0), expression,
NULL);
+ /* only free the sequence since we grabbed element 0 above */
+ if (ge)
+ asdl_seq_free(t); /* ok */
+ }
else
ge = comprehension(Tuple(t, Store, LINENO(ch)),
expression, NULL);
dot = strchr(src, '.');
attr = PyString_FromStringAndSize(src,
dot ? dot - src : strlen(src));
+ if (!attr)
+ return -1;
ADDOP_O(c, LOAD_ATTR, attr, names);
+ Py_DECREF(attr);
src = dot + 1;
}
}