[New-bugs-announce] [issue43181] Python macros don’t shield arguments
report at bugs.python.org
Tue Feb 9 17:05:50 EST 2021
New submission from Vitaliy <numzer0 at yandex.ru>:
There is a lot of macros like:
#define PyObject_TypeCheck(ob, tp) \
(Py_IS_TYPE(ob, tp) || PyType_IsSubtype(Py_TYPE(ob), (tp)))
These work fine until an argument happen to contain a comma. That’s possible as a result of other macro’s expansion. E.g. if U(x) is defined as x,
(Py_IS_TYPE(ob, f<a,b>(c)) || ...)
but < and > aren’t treated as brackets by the preprocessor so Py_IS_TYPE is now invoked with 3 arguments instead of just 2, breaking module compilation.
As arguments are expected to be values, surrounding each with parentheses solves the problem. But there are many such macros so that’s not an one-line fix.
Note: the example is from PyGLM (simplified), it doesn’t compile on 3.9 due to this issue.
components: C API
title: Python macros don’t shield arguments
versions: Python 3.9
Python tracker <report at bugs.python.org>
More information about the New-bugs-announce