Jonathan Underwood <jonathan.underw...@gmail.com> added the comment:

Py_SIZE is actually precisely specified and documented[1] as it stands; I don't 
think a change there is needed. The usage I outlined is in line with that 
documentation, and many other uses of that macro in the cpython sources.

The documentation issues are, at least:

1. There is no documentation specifying that bytes objects should be null 
terminated.

2. Nothing in the documentation of PyBytes_FromStringAndSize[2] specifies that 
passing 0 as the size results in a singleton being returned. This is 
undocumented behaviour, and it would seem fragile to rely on this.

But there are more implementation inconsistencies: the documentation for 
PyBytes_AsString()[3] returns a buffer which is one byte longer than the length 
of the object *in order to store a terminating null*, which implies that the 
object need not itself have a terminating null. I could go on with other 
examples, but this is very poorly defined behaviour.

Question: are bytes objects defined to be null terminated, or not?

Because if they're not defined to be null terminated, the fix I propose is 
correct even if it doesn't solve the other 100 bugs lurking in the code.

[Aside: even if bytes objects are in fact defined to be null terminated, I 
think the change proposed amounts to an optimization in any case.]

[1] https://docs.python.org/3/c-api/structures.html#c.Py_SIZE
[2] 
https://docs.python.org/3/c-api/bytes.html?highlight=pybytes_fromstringandsize#c.PyBytes_FromStringAndSize
[3] 
https://docs.python.org/3/c-api/bytes.html?highlight=pybytes_asstring#c.PyBytes_AsString

----------

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

Reply via email to