Dennis Sweeney <[email protected]> added the comment:
I got a segfault in a similar location:
static PyObject *
offer_suggestions_for_name_error(PyNameErrorObject *exc)
{
PyObject *name = exc->name; // borrowed reference
PyTracebackObject *traceback = (PyTracebackObject *) exc->traceback; //
borrowed reference
// Abort if we don't have a variable name or we have an invalid one
// or if we don't have a traceback to work with
if (name == NULL || traceback == NULL || !PyUnicode_CheckExact(name)) {
return NULL;
}
// Move to the traceback of the exception
while (traceback->tb_next != NULL) { <<<<<<<<<<<<<<< segfault: traceback
is junk (but not null) pointer
traceback = traceback->tb_next;
}
...
Adding ```assert(Py_TYPE(exc) == PyExc_NameError);``` fails, so somehow
something is getting cast to ```PyNameErrorObject *``` when it shouldn't be.
Here is some debugging code I used that also causes the crash:
----------------------------------------------
from unittest import TestCase
from unittest.case import _AssertRaisesContext
import sys
import traceback
manager = _AssertRaisesContext(Exception, TestCase(), 'aaa')
# inline this:
# with manager:
# aab
try:
aab
except:
# inline __exit__
exc_type, exc_value, tb = sys.exc_info()
traceback.clear_frames(tb)
manager.exception = exc_value.with_traceback(None)
output = '"{}" does not match "{}"'.format(
manager.expected_regex.pattern, str(exc_value))
# inline manager._raiseFailure(output)
msg = manager.test_case._formatMessage(manager.msg, output)
print("A:", f"{msg=!r}")
e = manager.test_case.failureException(msg)
print("B:", f"{e=!r}")
raise e
# Output:
# A: msg='"aaa" does not match "name \'aab\' is not defined"'
# B: e=AssertionError('"aaa" does not match "name \'aab\' is not defined"')
-----------------------------------------------
----------
nosy: +Dennis Sweeney
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue45826>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com