CString an einer FFI-Grenze: geliehenen Zeiger von übertragenem Besitz unterscheiden

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 · ffi · rust · strings

Gilt für: Rust std::ffi::CString

Symptome: A C call receives a dangling string pointer or memory is released by the wrong owner.

Den CString-Eigentümer bei geliehenen Aufrufen am Leben halten und die rohe Besitzübertragung nur unter einem expliziten Rückgabevertrag verwenden.

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

CString repräsentiert einen besessenen, C-kompatiblen, NUL-terminierten String ohne interne NUL-Bytes. Die Dokumentation unterscheidet das Ausleihen eines Zeigers vom Verbrauch des CString zu einem rohen Zeiger. Die Rekonstruktion des Besitzes mit from_raw ist auf Zeiger beschränkt, die vom entsprechenden into_raw-Pfad erzeugt wurden, mit zusätzlichen Anforderungen an die String-Länge. Rust CString

Warum es wichtig ist

Ein Agent kann einen kompakten Ausdruck schreiben, der einen Zeiger aus einem Temporärwert gewinnt und den Eigentümer zu früh verliert. Ein weiterer Fehler besteht darin, jeden von C zurückgegebenen char-Zeiger als von Rust besessenen String zu behandeln. Zunächst die fremde Funktion klassifizieren: unmittelbares Ausleihen, dauerhaftes Ausleihen oder Besitzübertragung.

So wird es angewendet

  • Die Aufbewahrungs- und Veränderungsregeln der fremden API lesen. Festhalten, ob der Zeiger nur während des Aufrufs verwendet, danach aufbewahrt, verändert oder irgendwann von der fremden Seite freigegeben wird.
  • Für einen geliehenen Aufruf den CString an einen Eigentümer binden, dessen Lebensdauer jeden fremden Zugriff abdeckt. Einen Konstruktionsfehler wegen interner NUL explizit behandeln statt die Eingabe stillschweigend abzuschneiden.
  • Wenn die fremde Seite den Zeiger aufbewahrt, ein Eigentümer- oder Registrierungsobjekt entwerfen, das lebendig bleibt, bis die Freigabe bestätigt ist. Eine gewöhnliche lokale Variable reicht nicht aus, wenn Callbacks den Aufruf überdauern können.
  • into_raw und from_raw nur verwenden, wenn der vollständige Besitz-Rundlauf dem dokumentierten Vertrag entspricht. Eine nicht damit zusammenhängende fremde Allokation auf ihrem eigenen fremden Freigabepfad belassen.
  • Grenzfälle für leere Strings, interne NUL, Nicht-ASCII-Bytes, dauerhaften Zugriff und wiederholtes Aufräumen vorschlagen. Sowohl Inhalt als auch Besitzverhalten prüfen.

Stolpersteine

Die NUL-Terminierung sagt für sich genommen nichts über die von der fremden Bibliothek erwartete Textkodierung aus. Ein const-Zeiger ist keine Erlaubnis für die fremde Seite, die Allokation zu verändern. Vermeiden, eine Besitzübertragung zu illustrieren, ohne auch zu zeigen, wer sie letztlich zurückgewinnt oder freigibt. Diese vorgeschlagenen Prüfungen beanspruchen keine FFI-Ausführung und keinen Speichersicherheitsbeweis.

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