Hi,
I'm working on the issue #18408 (fix issues found by my pyfailmalloc
tool). To analyze some bugs, I have to add debug traces in various
functions to find which function returned NULL without setting an
error, or the opposite: returned a valid object, but with an exception
set.
I would like to add assertions in Python/ceval.c to detect such bugs
earlier. The problem is that some functions rely on the ability to
call PyEval_EvalFrameEx() with an exception set. Is it expected?
Should it be avoided? The current exception can be replaced with a new
exception.
Example 1:
module = PyImport_Import(module_name);
if (module == NULL) {
PyErr_Format(PicklingError,
"Can't pickle %R: import of module %R failed",
obj, module_name);
goto error;
}
Formatting the obj argument calls indirectly PyEval_EvalFrameEx(),
whereas an ImportError was raised. The original ImportError is
replaced with a new PickleError exception.
To not call PyEval_EvalFrameEx() with an exception set, PyErr_Format()
can call PyErr_Clear() before calling PyUnicode_FromFormatV(), maybe
only in debug mode.
Example 2:
test_sqlite uses sqlite.connection.create_aggregate() to create a
Python callback called by the C sqlite3 library. The "callback" is a
class with 3 methods: constructor, step() and finalize(). The test
AggregateTests.CheckAggrNoStep() uses a class with no step() method:
it ensures that an AttributeError is raised.
The problem is that the finalize() method is called even if the class
has no step method, and so there is a current AttributeError
exception.
I don't know if finalize() should be called in this case. It may be a
bug in the sqlite module. More generally,
Victor
_______________________________________________
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com