STINNER Victor <vstin...@python.org> added the comment:

> I think that the risk for other formatting parameters is smaller, because you 
> know, that there are different formatting parameters for different integer 
> and floating point types, and for pointers, and you know that you should care 
> about truncation and overflow if the type of the argument is different from 
> the type of the parameter.

IMO such problem can be solved with documentation.

Pablo: can you try to explain the problem in the documentation, and maybe 
provide an example in the doc showing how to avoid it?

I guess that a generic fix is to replace "value" with "value != 0". In C, "expr 
!= 0" is an int, no?

What I understood is that Py_BuildValue("p", value) is problematic if value 
type is not int.

"!value" or "!!value" also has the issue if I understood correctly. Like:

    long value = 3; Py_BuildValue("p", !value);

I agree with Serhiy that Py_BuildValue() is ok-ish with other formats, but IMO 
it's the responsibility of the developer to pass the expect type (int for "p" 
format).

This problem is not specific to Py_BuildValue(). printf() also has exactly the 
same issue. Such code has an undefined behavior:

  long long x = 1; print("%d\n", x);

You must cast explicitly:

  long long x = 1; print("%d\n", (int)x);

Or use a different format, like:

  long long x = 1; print("%lld\n", x);

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue45325>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to