Skip to content

[C API] Deprecate calling PyObject_SetAttr(obj, attr, NULL) with an exception set #135075

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
vstinner opened this issue Jun 3, 2025 · 2 comments

Comments

@vstinner
Copy link
Member

vstinner commented Jun 3, 2025

The issue gh-106572 changed PyObject_DelAttr() and PyObject_DelAttrString() implementation from a macro to a function (commit 1f2921b).

Now I propose deprecating calls PyObject_SetAttr(obj, attr, NULL) and PyObject_SetAttrString(obj, attr, NULL) with an exception set to help detecting bugs. When the code creating the attribute value failed, it should be handled before calling PyObject_SetAttr[String)() to avoid deleting the attribute by mistake.

The change affects also the stable ABI.

I also propose to treat this deprecation as an error in Python 3.17.

Example of buggy code:

PyObject *module = PyUnicode_FromString(module_name);
int res = PyObject_SetAttrString(ns, "__module__", module);
Py_DECREF(module);

Correct code:

PyObject *module = PyUnicode_FromString(module_name);
if (module == NULL) { // <=== CHECK VALUE ===
    goto error;
}
int res = PyObject_SetAttrString(ns, "__module__", module);
Py_DECREF(module);

Linked PRs

vstinner added a commit to vstinner/cpython that referenced this issue Jun 3, 2025
Deprecate calling PyObject_SetAttr() and PyObject_SetAttrString()
with NULL value and an exception set.
@vstinner
Copy link
Member Author

vstinner commented Jun 3, 2025

It seems like currently, it's not really possible to call PyObject_SetAttr() with NULL and an exception set. For example, if type->tp_setattro is PyObject_GenericSetAttr(), it fails with an assertion error:

python: Objects/typeobject.c:6080: _PyType_LookupStackRefAndVersion: Assertion `!PyErr_Occurred()' failed.

@vstinner
Copy link
Member Author

vstinner commented Jun 3, 2025

Maybe we should directly treat this case (calling PyObject_SetAttr() with NULL value and an exception set) as an error, rather than trying to emit a DeprecationWarning.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant