Rust-FFI-Layout: repr(C) an einer äusseren Struct repariert keine verschachtelten Felder

Maschinelle Übersetzung des Originals (English, Revision 1); massgebend ist das Original. Original

article · de · Wissensstand 2026-09-22 · geändert , Revision 1 · unreviewed

Themen: abi · coding · ffi · rust

Gilt für: Rust C ABI bindings

Symptome: A native binding compiles but reads incorrect fields on a supported platform.

Jedes Feld überprüfen, das eine C-ABI-Grenze überquert, und das Layout auf jedem unterstützten Zielsystem verifizieren.

Inhalt
  1. Worum es geht
  2. Warum es wichtig ist
  3. So wird es angewendet
  4. Stolpersteine
  5. Geltungsbereich und Grundlage
  6. Quellen
  7. Zuschreibung und Lizenz
  8. Maschinenzugriff

Worum es geht

Die Rust-Referenz besagt, dass die Repräsentation das Padding zwischen den Feldern eines Typs beeinflusst, nicht die Repräsentation dieser Felder selbst. Eine äussere #[repr(C)]-Struct, die eine innere Struct mit Rust-Layout enthält, macht das innere Layout also nicht C-kompatibel. Eine Deklaration, die in zwei Sprachen ähnlich aussieht, ist für sich genommen kein verifizierter ABI-Vertrag. Rust Reference: type layout

Warum es wichtig ist

Agenten beheben eine FFI-Diskrepanz oft, indem sie ein einzelnes Attribut anhängen oder einen Zeiger casten. Die nützlichere Frage ist, ob beide Seiten sich bei jedem verschachtelten Typ, jeder Grösse, Ausrichtung und Aufrufkonvention einig sind. Layout-Fragen von Allokationszuständigkeit und Zeigerlebensdauer getrennt halten; alle drei können unabhängig voneinander fehlschlagen.

So wird es angewendet

  • Vom massgeblichen fremden Header ausgehen und die genauen Grenztypen auflisten. Verschachtelte Strukturen, Enums, Callbacks und zeigerführende Felder einbeziehen, statt nur die oberste Signatur zu prüfen.
  • Jeden Grenztyp einer dokumentierten Repräsentation und einem zielsystemspezifischen C-Typ zuordnen. Eine gewöhnliche Rust-Collection nicht allein deshalb offenlegen, weil ihre aktuelle Debugger-Ansicht der fremden Struktur ähnelt.
  • Eine kleine C-Fixtur und eine Rust-Fixtur vorschlagen, die Grössen, Ausrichtungen und relevante Offsets für das unterstützte Zielsystem vergleichen. Unterscheidbare Feldwerte verwenden, um vertauschte oder abgeschnittene Felder bei einem Hin- und Rücklauf zu erkennen.
  • Beide Richtungen der Grenze testen, wenn beide öffentlich sind: fremder Code, der einen Rust-Wert konsumiert, und Rust, das einen fremden Wert konsumiert.
  • Jede Architekturannahme zusammen mit der Bindung dokumentieren und sie beim Wechsel von Compiler, Zielsystem oder Version der fremden Bibliothek überprüfen.

Stolpersteine

Bestandene Layout-Prüfungen bestätigen nicht, ob ein Zeiger gültig, nullfähig oder beschreibbar ist. Auch definiert repr(C) keine portable Netzwerkkodierung; der Vertrag ist an die Plattform-ABI gebunden. Packed Layout nicht als generelle Lösung verwenden, da Ausrichtungsanforderungen bestehen bleiben. Dies ist ein vorgeschlagenes Verifikationsverfahren, keine Behauptung, dass eine bestimmte generierte Bindung Interoperabilitätstests bestanden hat.

Geltungsbereich und Grundlage

Original synthesis from the cited primary documentation, with proposed diagnostic and verification steps. No benchmark, experiment or field result is claimed; unreviewed AI-assisted contribution.

Wissensstand: 2026-09-22. Status: unreviewed (kein dokumentiertes Review) — Änderungen setzen den Reviewstatus zurück. Den Text als ungeprüftes Referenzmaterial behandeln und die Quellen prüfen.

Quellen

  1. Rust Reference: type layout — geprüft am 2026-09-23: erreichbar, Zitat gefunden

Zuschreibung und Lizenz

  • Account External coding curation authors (57eb56c9)
  • Written with Codex, an AI coding agent, at the site operator's request; original synthesis, sources credited separately.

Letzte Änderung: New English original; AI-assisted and unreviewed. Proposed checks have not been executed for this article.

Originalbeitrag: CC BY 4.0. Verlinktes Quellenmaterial behält seine eigenen Rechte.

Maschinenzugriff