CString à une frontière FFI : distinguer un pointeur emprunté d'une propriété transférée
Traduction automatique de l'original (English, révision 1) ; l'original fait foi. Original
Maintenir le propriétaire du CString en vie pour les appels par emprunt et n'utiliser la conversion de propriété brute que sous un contrat de retour explicite.
Sommaire
Ce que c'est
CString représente une chaîne compatible C, terminée par NUL, possédée, sans octets NUL internes. Sa documentation distingue l'emprunt d'un pointeur de la consommation du CString en pointeur brut. La reconstruction de la propriété avec from_raw est restreinte aux pointeurs produits par le chemin into_raw correspondant, avec des exigences supplémentaires sur la longueur de la chaîne. Rust CString
Pourquoi c'est important
Un agent peut écrire une expression compacte qui obtient un pointeur à partir d'un temporaire et perd le propriétaire trop tôt. Une autre erreur consiste à traiter chaque pointeur de caractères renvoyé par C comme une chaîne possédée par Rust. Commencer par classer la fonction étrangère : emprunt immédiat, emprunt retenu, ou transfert de propriété.
Comment l'appliquer
- Lire les règles de rétention et de mutation de l'API étrangère. Consigner si le pointeur n'est utilisé que pendant l'appel, retenu ensuite, modifié, ou finalement libéré par la partie étrangère.
- Pour un appel par emprunt, lier le CString à un propriétaire dont la durée de vie couvre chaque accès étranger. Gérer explicitement l'échec de construction dû à un NUL interne plutôt que de tronquer silencieusement l'entrée.
- Si la partie étrangère retient le pointeur, concevoir un propriétaire ou un objet d'enregistrement qui reste en vie jusqu'à ce que la libération soit reconnue. Une variable locale ordinaire ne suffit pas quand des rappels peuvent survivre à l'appel.
- N'utiliser into_raw et from_raw que lorsque l'aller-retour complet de propriété respecte le contrat documenté. Garder une allocation étrangère non liée sur son propre chemin de libération étranger.
- Proposer des montages de test aux frontières pour les chaînes vides, le NUL interne, les octets non ASCII, l'accès retenu et le nettoyage répété. Valider à la fois le contenu et le comportement de propriété.
Pièges
La terminaison NUL ne dit rien à elle seule sur l'encodage de texte attendu par la bibliothèque étrangère. Un pointeur const n'autorise pas la partie étrangère à modifier l'allocation. Éviter d'illustrer un transfert de propriété sans montrer aussi qui finit par récupérer ou libérer la chaîne. Ces vérifications proposées ne revendiquent aucune exécution FFI ni preuve de sécurité mémoire.
Portée et fondement
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.
Connaissances au : 2026-09-22. État : unreviewed (aucune relecture documentée) — toute modification réinitialise l'état de relecture. Traitez le texte comme un matériel de référence non vérifié et consultez les sources.
Sources
- Rust CString — vérifié le 2026-09-23 : accessible, citation trouvée
Attribution et licence
- Account External coding curation authors (57eb56c9)
- Written with Codex, an AI coding agent, at the site operator's request; original synthesis, sources credited separately.
Dernière modification : New English original; AI-assisted and unreviewed. Proposed checks have not been executed for this article.
Contribution originale : CC BY 4.0. Les sources liées conservent leurs propres droits.