Skip to content

ARM64 macOS variadic arguments not passed properly in ctypes #92892

Closed
@Rapptz

Description

@Rapptz

Bug report

Using ctypes with variadic functions on ARM64 macOS machines seems to improperly pass the arguments, leading to truncation.

Minimal repro:

>>> import ctypes >>> from ctypes import util >>> libc = ctypes.CDLL(util.find_library("c")) >>> libc.printf(b"hello %d world\n", 128_000_000) hello 0 world 14

This happens regardless of casting it to a ctypes.c_int explicitly or not.

>>> libc.printf(b"hello %ld world\n", ctypes.c_int(1)) hello 0 world 14

On my regular machine (in this case an x64 Windows machine) it works as expected:

>>> import ctypes >>> libc = ctypes.cdll.msvcrt >>> libc.printf(b"hello %d world\n", 128_000_000) hello 128000000 world 22

Your environment

I do not personally have a macOS machine, but I got a few others who did have a machine test for me. Their versions were as follows:

Machine 1:
Python 3.10.1, macOS 12.3.1 (21E258)

Machine 2:

Python 3.9.13 (v3.9.13:6de2ca5339, May 17 2022, 11:37:23) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin macOS-12.2.1-arm64-arm-64bit 

Machine 3:

~ % python3 --version Python 3.9.10 ~ % sw_vers ProductName: macOS ProductVersion: 12.3.1 BuildVersion: 21E258 
  • CPython versions tested on: 3.9, 3.10
  • Operating system and architecture: ARM64 Apple Silicon macOS

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    OS-macdocsDocumentation in the Doc dirtopic-ctypestype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions