Packed-Felder in Rust: keine unausgerichtete Referenz vor einem Raw-Pointer-Cast erzeugen

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

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

Themen: coding · memory-layout · rust · unsafe

Gilt für: Rust packed structures and raw-pointer reads

Symptome: A packed-field access is rejected or an unsafe cast is proposed as a workaround.

Erklärt, warum eine temporäre Referenz Ausrichtungsanforderungen bereits verletzen kann, und zieht, wo möglich, ein explizites Byte-Dekodieren vor.

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 Dokumentation von read_unaligned in Rust warnt, dass es bereits ungültig ist, eine Referenz auf ein unausgerichtetes packed-Feld zu bilden und diese Referenz dann in einen Raw Pointer zu casten. Die zwischenzeitliche Referenz selbst muss ausgerichtet sein. Die dokumentierte Raw-Address-Syntax vermeidet das Erzeugen dieser Referenz, während read_unaligned die Ausrichtungsanforderungen für den Lesevorgang lockert. Rust read_unaligned

Warum es wichtig ist

Ein Agent könnte annehmen, dass eine nur für einen Augenblick verwendete Referenz keine Rolle spielen kann. Hier gilt die Gültigkeit aber bereits im Moment der Bildung der Referenz. Den gesamten Ausdruck prüfen, nicht nur den endgültigen Zeigertyp. Auch fragen, ob das Interpretieren einer packed-Struktur überhaupt nötig ist oder ob ein expliziter Byte-Parser das Format besser ausdrücken würde.

So wird es angewendet

  • Die tatsächliche Adresse des Felds und die erforderliche Ausrichtung aus dem Layout-Vertrag ermitteln. Das native Struktur-Layout getrennt von der Byte-Reihenfolge einer externen Datei oder eines Protokolls halten.
  • Nach Ausdrücken suchen, die das Feld ausleihen, einschliesslich bequemer Formatierung oder Hilfsaufrufe, bevor der endgültige Lesevorgang geprüft wird. Ein späterer Cast kann eine vorherige ungültige Referenz nicht rückgängig machen.
  • Falls ein unausgerichteter Rohlesevorgang nötig ist, die dokumentierte Konstruktion verwenden, die eine Referenz vermeidet, und Zeigergültigkeit, Initialisierung und zugänglichen Byte-Bereich getrennt begründen.
  • Bei einfachen Protokoll-Ganzzahlen erwägen, die benötigten Bytes in einen explizit dekodierten Wert zu kopieren. Das kann sowohl Grenzen als auch Byte-Reihenfolge an der Parser-Grenze sichtbar machen.
  • Testvorrichtungen mit dem Feld an unterschiedlich ausgerichteten Offsets, abgeschnittenen Puffern und gültigen Grenzwerten vorschlagen. Ablehnungspfade prüfen, nicht nur erfolgreiches Dekodieren.

Stolpersteine

read_unaligned validiert keine beliebigen Zeiger und macht kein ungültiges Bitmuster zu einem gültigen Wert irgendeines gewählten Typs. Das Duplizieren eines nicht-Copy-Werts mit einem Rohlesevorgang erfordert zudem eine Überlegung zum Besitz (Ownership). Nicht von der Toleranz eines Prozessors gegenüber einem Ladevorgang auf die Gültigkeit nach der Rust-Sprachdefinition schliessen. Die hier beschriebenen Prüfungen sind vorgeschlagen und wurden für diesen Artikel nicht ausgeführt.

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 read_unaligned — 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