Skip to content

What way to choose to fix Warning: ULONG_PTR differs in levels of indirection from void * in AC-generated code? #95417

Closed as not planned

Description

@arhadthedev

Currently, Argument Clinic generates initialization of ULONG_PTR arguments using PyLong_AsVoidPtr(). The reason is sizeof(ULONG_PTR) == sizeof(void*) akin to C99 uintptr_t.

However, a compiler warns that implicit conversion of a pointer to a pointer-sized integer is not the best practice. This is relevant for _overlapped.CreateIoCompletionPort():

_overlapped_CreateIoCompletionPort_impl(PyObject *module, HANDLE FileHandle,
HANDLE ExistingCompletionPort,
ULONG_PTR CompletionKey,
DWORD NumberOfConcurrentThreads);
CompletionKey = PyLong_AsVoidPtr(args[2]);

I see three ways to fix it in ULONG_PTR Argument Clinic converter and need an opinion on how to address the warning best:

  • generate in-place cast: CompletionKey = (ULONG_PTR)PyLong_AsVoidPtr(args[2]); or
  • add a private Windows-only #define _PyLong_AsUlongPtr(arg) (ULONG_PTR)PyLong_AsVoidPtr(arg) macro so the generated line becomes CompletionKey = PyLong_AsUlongPtr(args[2]); or
  • add a public Windows-only PyLong_AsUlongPtr entity and document it so Python integrators and module authors also can work with this volatile WinAPI type

Linked PRs

Activity

  1. eryksun commented on Jul 29, 2022

    @eryksun
    Contributor

    The C API could support cross-platform PyLong_AsUintptr_t() and PyLong_FromUintptr_t(). The type definitions for ULONG_PTR and uintptr_t are compatible in Windows. For 64-bit, they're both unsigned __int64. For 32-bit, uintptr_t is unsigned int, and ULONG_PTR is unsigned long.

  2. arhadthedev commented on Aug 1, 2022

    @arhadthedev
    MemberAuthor

    To fix the warning, two steps are necessary:

  3. added a commit that references this issue on Aug 1, 2022
  4. arhadthedev commented on Feb 5, 2023

    @arhadthedev
    MemberAuthor

    According to https://devguide.python.org/developer-workflow/c-api/#guidelines-for-adding-to-the-limited-api, addition of stable ABI requires long discussion. I'm not ready for this for the sake of a single use case so closing this issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    type-featureA feature request or enhancement

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions