Aller au contenu
EN FR

Chaînes UTF-8 dans les wrappers ABI générés

Statut documentaire : reference — voir Maturité et preuves.

Le contrat ABI natif généré définit déjà une convention concrète pour les chaînes. À la frontière native, les chaînes sont projetées en pointeurs UTF-8 terminés par zéro.

Le générateur fixe explicitement les règles d'ownership suivantes :

  • chaîne en entrée : UTF-8, ownership appelant ;
  • chaîne en sortie/retour : UTF-8, ownership module et libération via Free du module ;
  • chaîne in/out : ownership appelant en entrée, module en sortie ;
  • le module ne doit pas conserver les pointeurs de chaînes d'entrée après l'appel.

Comportement du wrapper généré

Les wrappers natifs générés allouent les buffers UTF-8 de résultat et exposent une fonction Free du module. La même symétrie d'allocation est utilisée par GetLastError : l'appelant reçoit une allocation UTF-8, la copie puis la libère via le module.

Le modèle C# généré projette les chaînes source vers string. Les pointeurs caractères utilisés comme signatures de chaînes sont eux aussi projetés vers string, car le wrapper natif généré réalise la conversion UTF-8.

Les chaînes de retour sont décodées par le runtime .NET généré plutôt que d'être exposées comme IntPtr au code applicatif.

Distinction importante entre les couches

Le contrat du wrapper généré supporte les chaînes UTF-8, mais tous les exécuteurs génériques ou bridges expérimentaux du code ne supportent pas nécessairement chaque type publié.

Il faut donc distinguer :

support publication/générateur
        !=
certification de tous les bridges d'exécution

Cette page est en reference pour la convention chaîne de l'ABI native générée. Les pages propres aux bridges doivent annoncer leur sous-ensemble d'exécution.

Null et vide

La convention native générée est fondée sur un pointeur et une terminaison zéro. Les bindings doivent préserver la différence sémantique entre une référence nulle lorsque le contrat l'autorise et une chaîne vide lorsque l'API cible les distingue.

Le code applicatif ne doit jamais posséder directement le pointeur UTF-8 natif. L'infrastructure générée/runtime gère encodage, copie et libération.

Projection .NET

Pour .NET, la projection normale est string / string nullable. Le binding réalise :

chaîne managée
 -> buffer UTF-8 limité à l'appel
 -> wrapper natif généré
 -> Runtime

Pour un retour :

Runtime
 -> pointeur UTF-8 propriété du module
 -> copie vers string par le runtime .NET généré
 -> Free du module

Note cross-topology

RPC transporte les chaînes comme valeurs du protocole sans exposer le pointeur natif. La parité sémantique doit être validée au niveau du contrat généré, et non en imposant la même représentation physique en local et à distance.