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
@arhadthedev

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

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