-
-
Notifications
You must be signed in to change notification settings - Fork 32.1k
ctypes: clearly document how structure bit fields are allocated #57089
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
Comments
As issues like bpo-6069 and bpo-11920 allude to, figuring out how 'ctypes' allocates bit-fields is not very clear. The documentation should be enhanced to flesh this out in more detail. As an example, Microsoft documents the VC++ implementation in a reasonably clear manner ( http://msdn.microsoft.com/en-us/library/ewwyfdbe(v=vs.71).aspx ). |
Another example of desperately needed documentation: bpo-12945. |
Attached doc update against tip (though I still hope my patch for configurable allocation strategies will make it in). This is my first doc patch so let me know if I missed something. I am basically explaining that bit field allocation is compiler-specific and no assumptions should be made of how a bitfield is allocated. I believe this is the better thing to do rather than detailing how GCC and MSVC allocated their bitfields because that would just encourage people to use this feature incorrectly. Most bugs opened on bit fields are because people are toying with the underlying buffer and get other results than what they expect. IMO, when using bitfields one should only access the structure members at a high level and not go read/write the raw memory underneath. |
On Fri, Sep 30, 2011 at 12:19 PM, Vlad Riscutia <report@bugs.python.org> wrote:
So clearly documenting how a feature works will cause people to use
The issues that I have looked at (bpo-6069, bpo-11920, and The general content of your patch seems reasonable. I will provide |
Added some comments in rietveld. P.S. watch out for trailing whitespace |
Thanks for the "make patchcheck" tip, I didn't know about that. I will update the patch soon. In the mean time, I want to point out a couple of things: Since this is platform dependent, they shouldn't worry about the raw memory as long as C interop works fine. Bitfield layout is complex as it involves both allocation algorithm and structure packing and same Python code will work differently on Windows and Unix. My point is that documenting all this low-level stuff will encourage people to work with the raw memory which will open the door for other issues. I believe it would be better to encourage users to stick to declaring members and accessing them by name as raw memory WILL be different for the same code on different OSes. Second, one of your review comments is: "GCC is used for most Unix systems and Microsoft VC++ is used on Windows.". This is not how ctypes works. Ctypes implements the bitfield allocation algorithm itself, it doesn't use the compiler with which it is built. Basically it says #ifdef WIN32 - allocate like VC++ - #else - allocate like GCC. So it doesn't really matter with which compiler you are building Python. It will still do GCC style allocation on Solaris. |
On Tue, Oct 4, 2011 at 10:21 AM, Vlad Riscutia <report@bugs.python.org> wrote:
Please qualify "all" instead of generalizing. I can point to two The reason that we are seeing folks cast raw memory into a cyptes
I understand how it works. This quote is taken somewhat out of Also, in general, the compiler used to build the ctypes extension |
Well, not *all* the native alignments, but many of them. |
I agree compiler matters for alignment but if you look at PyCField_FromDesc, you will see the layout is pretty much #ifdef MS_WIN32 - #else. Sorry for generalizing, "all" indeed is not the right word. My point is that we should set expectation correctly - VC++-style on Windows, GCC-style everywhere else and encourage users to access structure members by name, not raw memory. Issues opened for bitfields *usually* are of the form I mentioned - setting raw memory to some bytes then seeing members are not what user expected, even if ctypes algorithm works correctly. As I said, I will revise the patch and maybe make it more clear that users should look up how bitfield allocation works for their compiler instead of trying to understand this via structure raw memory. |
If I understand correctly, this doc patch would apply to 2.7 and 3.2 also. I have two style comments. I believe "It is important to note that bit field allocation and layout in memory is not defined as a standard, rather its implementation is compiler-specific." could be shortened to "Bit field allocation and memory layout is compiler-specific." To me, this leads nicely into the proposed sentence that follows. "it is recommended that no assumptions are made about the structure size and layout." I do not like 'it is recommended'. Let us state the fact. "any assumptions about the structure size and layout may be wrong." |
Co-Authored-By: Meador Inge <meadori@gmail.com>
You can now change the behavior with |
Co-authored-by: Meador Inge <meadori@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com>
(cherry picked from commit b22b964) Co-authored-by: Petr Viktorin <encukou@gmail.com> Co-authored-by: Meador Inge <meadori@gmail.com> Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com>
Uh oh!
There was an error while loading. Please reload this page.
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
Linked PRs
The text was updated successfully, but these errors were encountered: