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 marque une déclaration comme ne nécessitant pas de contexte sur son site d’utilisation unsafe sous le modèle de sécurité de mémoire mis à jour. Le safe modificateur est l’équivalent de unsafe. Un contexte non sécurisé n’est pas requis pour les appelants d’une safe déclaration, tout en unsafe propageant l’obligation d’auditer la sécurité à l’appelant.
L’utilisation du safe mot clé lui-même nécessite l’option AllowUnsafeBlocks du compilateur (-unsafe), même si les appelants n’ont pas besoin d’un unsafe contexte. Les déclarations ordinaires sont sécurisées par défaut, donc omettez-les safe là où il n’est pas nécessaire d’éviter de nécessiter inutilement une compilation non sécurisée.
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. Définissez cette option LangVersion pour preview activer la syntaxe. Pour appliquer également les règles mises à jour, y compris des choix explicites safe ou unsafe des choix et des obligations d’appelants non sécurisés, activez la fonctionnalité du updated-memory-safety-rules compilateur. Pour plus d’informations sur l’activation, consultez Activer les règles de sécurité de mémoire mises à jour. Pour obtenir la conception complète, consultez la spécification de la fonctionnalité de sécurité de la mémoire.
Déclarations autorisées et requises
Vous pouvez appliquer safe des déclarations qui autorisent un modificateur nécessitant une sécurité requise, notamment les méthodes, les constructeurs, les propriétés et les champs. Pour les déclarations ordinaires, le modificateur peut rendre le contrat prévu explicite, y compris dans le code généré par la source. Il n’est pas limité aux extern membres et aux champs de disposition.
Certaines déclarations nécessitent un choix explicite ou safeunsafe lorsque les règles mises à jour sont activées. Les sections suivantes décrivent extern les membres et les champs de disposition explicites ou étendus.
Contrairement unsafeà , safe n’établit pas de contexte lexical. Il n’effectue pas d’opérations non sécurisées dans un corps membre ou annule un contexte non sécurisé englobant. Vous ne pouvez pas combiner les modificateurs et unsafe les safe modifier sur la même déclaration ; cela produit CS9388.
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:
// Syntax requires LangVersion preview; enforcement requires the updated-memory-safety-rules compiler feature.
[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. Avec les règles mises à jour activées, l’omission des deux modificateurs est une erreur.
Champs de disposition explicites ou étendus
Dans un type avec [StructLayout(LayoutKind.Explicit)] ou [ExtendedLayout], le compilateur ne peut pas classifier la sécurité de chaque champ d’instance par lui-même. Vous marquez chaque champ de ce type ou safeunsafe:
// Syntax requires LangVersion preview; enforcement requires the updated-memory-safety-rules compiler feature.
[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 La même règle s’applique aux champs de disposition explicite et aux champs de disposition étendue. Comme pour extern les membres, l’omission des deux modificateurs est une erreur lorsque les règles mises à jour sont activées.
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.