ctypes: subclassed swapped endianness doesn't swap

Offen
#95,384 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
35/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Veraltet
Tech-Stack
python
Bereich
backend

Rechercherichtung

Beginne damit, das minimale ctypes-Beispiel mit c_ushort.ctype_be und einer Unterklasse zu reproduzieren, und vergleiche anschließend das from_buffer_copy-Verhalten des getauschten Basistyps und der Unterklasse. Verfolge die Verarbeitung getauschter einfacher Typen in ctypes und ermittle, wie sich der Pfad der Unterklasse unterscheidet; abgeschlossen ist die Aufgabe, wenn die Unterklasse denselben bytegetauschten Wert wie der Basistyp erzeugt und die Regression durch einen Test abgedeckt ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

topic-ctypes type-bug

Bug report

Subclassing a swapped simple type and calling from_buffer_copy doesn't swap bytes. Here is a minimal non-working example.

import ctypes

cshort_be = ctypes.c_ushort.__ctype_be__
class Short(cshort_be):
    pass

print(cshort_be.from_buffer_copy(b"\x00\x01").value) # prints 1
print(Short.from_buffer_copy(b"\x00\x01").value) # prints 256

However, there is a simple workaround:

print(Short.__ctype_be__.from_buffer_copy(b"\x00\x01").value) # prints 1

I am not sure what happens, but ctypes behave kinda weird when subclassing native types. So this bug might be related to issue #73456.

My environment

  • CPython versions tested on: 3.10.5
  • Operating system and architecture: Linux Celap 5.18.0-1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 5.18.2-1 (2022-06-06) x86_64 GNU/Linux
Vorherrschende Sprache
Python
Sterne
77.2k
Forks
36k
Ø Merge
1 T. 9 Std.
Gemergte PRs (30 T.)
558

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus python/cpython

Alle Issues in python/cpython

Ähnliche Issues

Weitere Issues zu Python

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.