Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le safe mot clé contextuel atteste qu’une déclaration est sonore dans les endroits où le modèle de sécurité de mémoire mis à jour vous oblige à rendre le choix de sécurité explicite. Vous appliquez safe en tant que modificateur sur une déclaration que le compilateur ne peut pas classifier par lui-même, tel qu’un extern membre ou un champ dans un struct avec une disposition explicite. Le safe modificateur est l’équivalent de unsafe: safe atteste que les appelants n’ont pas unsafe besoin de contexte, tout en unsafe propageant l’obligation d’auditer la sécurité à l’appelant.
Important
Le safe mot clé fait partie du modèle de sécurité de mémoire mis à jour, une fonctionnalité d’aperçu en C# 15 et .NET 11. Le compilateur dans .NET 11 Preview 5 ne reconnaît pas encore le mot clé. Pour suivre la fonctionnalité, définissez l’option du LangVersion compilateur sur preview. Pour obtenir la conception complète, consultez la spécification de la fonctionnalité de sécurité de la mémoire. Le code de cet article présente la syntaxe proposée et ne se compile pas avec le compilateur en préversion actuel.
Membres extern
Un extern membre appelle du code natif afin que le compilateur ne puisse pas classifier sa sécurité. Sous le modèle mis à jour, vous marquez chaque extern déclaration, y compris une LibraryImport méthode partielle, soit safeunsafe:
// Preview: illustrates the updated model, which the current compiler doesn't enforce yet.
[LibraryImport("libc")]
internal static safe partial int getpid();
[LibraryImport("libc", StringMarshalling = StringMarshalling.Utf8)]
internal static unsafe partial nint strlen(byte* str);
getpid n’accepte aucun paramètre et retourne une primitive, de sorte que l’auteur atteste que l’appel est sécurisé et que les appelants l’utilisent sans unsafe contexte.
strlen prend un pointeur brut que le code natif déréférence, de sorte que la déclaration est unsafe et propage l’obligation à ses appelants. Omettre les deux modificateurs est une erreur, ce qui vous oblige à prendre la décision de sécurité.
Champs de disposition explicite
Dans un struct avec [StructLayout(LayoutKind.Explicit)], les champs peuvent se chevaucher en mémoire, de sorte que le compilateur ne peut pas raisonner si une lecture dans un champ est son. Vous marquez chaque champ d’un tel struct ou safeunsafe:
// Preview
[StructLayout(LayoutKind.Explicit)]
internal struct Union
{
[FieldOffset(0)]
internal safe int AsInt;
[FieldOffset(0)]
internal safe float AsFloat;
}
Champ qui contient un pointeur natif, ou dont le type porte sinon une invariante que le système de type ne peut pas exprimer, est unsafe. Champ dont le type est entièrement décrit par le système de type .safe Comme pour extern les membres, l’omission des deux modificateurs est une erreur.
Spécification du langage C#
Pour plus d’informations, consultez Code non sécurisé dans la spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.
Pour la conception du modèle de sécurité de mémoire mis à jour, consultez la spécification de la fonctionnalité de sécurité de la mémoire.