-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Check dict item accesses where it isn't already checked #2863
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
Conversation
#endif | ||
} | ||
|
||
inline PyObject * dict_getitem(PyObject *v, PyObject *key) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why isn't this a member of py::dict
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Because the code that is intended to call this (function dispatcher) uses the raw CPython API, presumably for performance reasons?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fair enough.
Also, if someone could retrigger the checks for this, it's likely that the tests will pass. |
#endif | ||
} | ||
|
||
inline PyObject * dict_getitem(PyObject *v, PyObject *key) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fair enough.
throw error_already_set(); | ||
} | ||
|
||
rv = PyDict_GetItemWithError(v, kv); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
At this point, can't you just call dict_getitemstring
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nope, still has potential to raise an exception. See https://bugs.python.org/issue35459
As copied from cpython @ https://github.com/python/cpython/blob/d5fc99873769f0d0d5c5d5d99059177a75a4e46e/Objects/dictobject.c#L1545
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My bad, I was thinking about calling your dict_getitem
. From this line on, dict_getitemstring
and dict_getitem
are the same.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not quite the same, Py_DECREF needs to be called on the key before the error is thrown.
eb98f16
to
a14ee3c
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks great from my side! Just a minor nit on rationale comment. (Yeah, discoverable via git blame
+ clicks, but mayhaps a terse statement could help!)
Hi Dustin, sorry for the long delay! This PR escaped me before. It looks very important. |
Nice, thanks! Good to see that the new clang-tidy is happy. |
I forgot to mention, I already integrated this PR for Google-internal global testing. I'll hold off merging until I get the results, later tonight if things go well. |
The Google-internal testing was successful. Merging! |
Description
Suggested changelog entry: