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
Jedes Feld überprüfen, das eine C-ABI-Grenze überquert, und das Layout auf jedem unterstützten Zielsystem verifizieren.
Inhalt
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
- 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.