Partager via


Résoudre les erreurs et les avertissements dans les constructions de code non sécurisées

Cet article traite des erreurs suivantes du compilateur :

  • CS0193 : L’opérateur * ou -> doit être appliqué à un pointeur de données
  • CS0196 : un pointeur doit être indexé par une seule valeur
  • CS0208 : Impossible de prendre l’adresse, d’obtenir la taille ou de déclarer un pointeur vers un type managé ('type')
  • CS0209 : Le type de local déclaré dans une instruction fixe doit être un type de pointeur
  • CS0210 : Vous devez fournir un initialiseur dans une déclaration fixe ou using d’instruction
  • CS0211 : Impossible de prendre l’adresse de l’expression donnée
  • CS0212 : Vous ne pouvez prendre l’adresse d’une expression non corrigée qu’à l’intérieur d’un initialiseur d’instruction fixe
  • CS0213 : Vous ne pouvez pas utiliser l’instruction fixe pour prendre l’adresse d’une expression déjà fixe
  • CS0214 : Les pointeurs et les mémoires tampons de taille fixe peuvent uniquement être utilisés dans un contexte non sécurisé
  • CS0227 : Le code non sécurisé ne peut apparaître que lors de la compilation avec /unsafe
  • CS0233 : 'identificateur' n’a pas de taille prédéfinie. Par conséquent, la tailleof ne peut être utilisée que dans un contexte non sécurisé
  • CS0242 : L’opération en question n’est pas définie sur les pointeurs void
  • CS0244 : Ni 'is' ni 'as' n’est valide sur les types de pointeur
  • CS0254 : Le côté droit d’une affectation d’instruction fixe peut ne pas être une expression cast
  • CS0459 : Impossible de prendre l’adresse d’une variable locale en lecture seule
  • CS0821 : Les locaux implicitement typés ne peuvent pas être corrigés
  • CS1641 : Un champ de mémoire tampon de taille fixe doit avoir le spécificateur de taille de tableau après le nom du champ
  • CS1642 : Les champs de mémoire tampon de taille fixe peuvent uniquement être membres de structs.
  • CS1656 : Impossible d’affecter à « variable », car il s’agit d’un « type de variable en lecture seule »
  • CS1663 : Type de mémoire tampon de taille fixe doit être l’un des éléments suivants : bool, , byteshort, intlong, , char, sbyte, , ou ushortuintulongfloatdouble
  • CS1665 : Les mémoires tampons de taille fixe doivent avoir une longueur supérieure à zéro
  • CS1666 : Vous ne pouvez pas utiliser de mémoires tampons de taille fixe contenues dans des expressions non corrigées. Essayez d’utiliser l’instruction fixe.
  • CS1708 : Les mémoires tampons de taille fixe sont accessibles uniquement par le biais de locaux ou de champs
  • CS1716 : N’utilisez pas l’attribut 'System.Runtime.CompilerServices.FixedBuffer'. Utilisez le modificateur de champ « fixe » à la place.
  • CS1919 : Le type non sécurisé 'nom de type' ne peut pas être utilisé dans la création d’objets.
  • CS4004 : Impossible await dans un contexte non sécurisé
  • CS8812 : Impossible de convertir le &Method groupe en type pointeur non de fonction.
  • CS9049 : Un champ fixe ne doit pas être un champ ref.
  • CS9123 : L’opérateur '&' ne doit pas être utilisé sur les paramètres ou les variables locales dans les méthodes asynchrones.

Opérations de pointeur et déréférencement

  • CS0193 : L’opérateur * ou l’opérateur -> doit être appliqué à un pointeur de données
  • CS0196 : un pointeur doit être indexé par une seule valeur
  • CS0242 : L’opération en question n’est pas définie sur les pointeurs void

Pour utiliser correctement les opérations de pointeur, suivez les règles de déreferencing, d’indexation et d’opérations arithmétiques. Pour plus d’informations, consultez Les types de pointeurs et les pointeurs de fonction.

  • Appliquez l'opérateur * ou l'opérateur -> uniquement aux pointeurs de données (CS0193). N’utilisez pas ces opérateurs avec des types non-pointeurs ou des pointeurs de fonction. Contrairement à C/C++, vous ne pouvez pas déréférer les pointeurs de fonction en C#.
  • Pointeurs d’index avec une seule valeur (CS0196). L’indexation multidimensionnelle n’est pas prise en charge sur les pointeurs.
  • Évitez les opérations qui ne sont pas définies sur les pointeurs void (CS0242). Par exemple, n’incrémentez pas de pointeur void, car le compilateur ne connaît pas la taille des données vers lesquelles il pointe.

Types de pointeur et types managés

  • CS0208 : Impossible de prendre l’adresse, d’obtenir la taille ou de déclarer un pointeur vers un type managé ('type')
  • CS0233 : 'identificateur' n’a pas de taille prédéfinie. Par conséquent, la tailleof ne peut être utilisée que dans un contexte non sécurisé

Pour travailler correctement avec des pointeurs et l’opérateur sizeof , utilisez des types non managés et des contextes appropriés. Pour plus d’informations, consultez Types non managés et sizeof opérateur.

  • Utilisez des pointeurs uniquement avec des types non managés (CS0208). Ne prenez pas l'adresse de, ne déterminez pas la taille de, et ne déclarez pas de pointeurs vers des types gérés. Les types managés incluent des types de référence et des structs qui contiennent des champs ou des propriétés de type de référence.
  • Utilisez l’opérateur dans un sizeof contexte lors de l’utilisation de types dont la taille n’est pas une constante au moment de la unsafe compilation (CS0233).

Tampons fixes

  • CS0209 : Le type de local déclaré dans une instruction fixe doit être un type de pointeur
  • CS0210 : Vous devez fournir un initialiseur dans une déclaration fixe ou using d’instruction
  • CS0211 : Impossible de prendre l’adresse de l’expression donnée
  • CS0212 : Vous ne pouvez prendre l’adresse d’une expression non corrigée qu’à l’intérieur d’un initialiseur d’instruction fixe
  • CS0213 : Vous ne pouvez pas utiliser l’instruction fixe pour prendre l’adresse d’une expression déjà fixe
  • CS0254 : Le côté droit d’une affectation d’instruction fixe peut ne pas être une expression cast
  • CS0459 : Impossible de prendre l’adresse d’une variable locale en lecture seule
  • CS0821 : Les variables locales implicitement typées ne peuvent pas être fixées
  • CS1656 : Impossible d’affecter à « variable », car il s’agit d’un « type de variable en lecture seule »

Ces erreurs se produisent lorsque vous utilisez l’instructionfixed de manière incorrecte. L’instruction fixed empêche le garbage collector de déplacer une variable mobile et déclare un pointeur vers cette variable. Pour plus d’informations, consultez Code et pointeurs non sécurisés.

Pour utiliser correctement l’instruction fixed :

  • Déclarez la variable en tant que type de pointeur (CS0209).
  • Fournissez un initialiseur dans la déclaration d’instruction fixed (CS0210).
  • Prenez l’adresse uniquement des expressions valides : champs, variables locales et indirection de pointeur (CS0211). Ne prenez pas l’adresse des expressions calculées comme la somme de deux variables.
  • Utilisez l’opérateur address-of sur les expressions nonfixées uniquement dans l’initialiseur fixed d’instruction (CS0212).
  • N’utilisez pas d’instruction fixed sur des expressions déjà fixes (CS0213). Les variables locales et les paramètres d’une méthode unsafe sont déjà positionnés sur la pile.
  • N’utilisez pas d’expressions de cast du côté droit d’une instruction d’affectation fixed (CS0254).
  • Ne prenez pas l’adresse des variables locales en lecture seule (CS0459). Les variables dans foreach les boucles, using les instructions et fixed les déclarations sont en lecture seule.
  • Utilisez des types explicites au lieu d’instructions varfixed (CS0821).
  • N’assignez pas de variables dans des contextes en lecture seule, tels que les boucles foreach, les instructions if using, ou les instructions for fixed (CS1656).

Restrictions de contexte non sécurisées

  • CS0214 : Les pointeurs et les mémoires tampons de taille fixe peuvent uniquement être utilisés dans un contexte non sécurisé
  • CS0227 : Le code non sécurisé ne peut apparaître que si la compilation se fait avec /unsafe
  • CS0244 : Ni 'is' ni 'as' n’est valide sur les types de pointeur
  • CS1919 : Le type non sécurisé 'nom de type' ne peut pas être utilisé dans la création d’objets
  • CS4004 : Impossible d’attendre dans un contexte non sécurisé
  • CS9123 : L’opérateur '&' ne doit pas être utilisé sur les paramètres ou les variables locales dans les méthodes asynchrones

Ces erreurs se produisent lorsque vous utilisez des constructions de code non sécurisées sans contexte non sécurisé approprié ou lorsque vous tentez des opérations qui ne sont pas autorisées dans le code non sécurisé. Pour plus d’informations, consultez Code et pointeurs non sécurisés et mot unsafe clé.

Pour utiliser le code non sécurisé correctement :

  • Marquez des méthodes, des types ou des blocs de code qui utilisent des pointeurs ou des mémoires tampons de taille fixe à l’aide du unsafe mot clé (CS0214).
  • Activez l’option du compilateur AllowUnsafeBlocks dans les paramètres de votre projet lors de l’utilisation du unsafe mot clé (CS0227).
  • N’utilisez pas les opérateurs is ou as avec des types de pointeur (CS0244). Ces opérateurs de test de type ne sont pas valides pour les pointeurs.
  • N’utilisez pas l’opérateur new pour créer des instances de type pointeur (CS1919). Pour créer des objets en mémoire non managée, utilisez l’interopérabilité pour appeler des méthodes natives qui retournent des pointeurs.
  • Séparez le code non sécurisé du code asynchrone (CS4004). Créez des méthodes distinctes pour les opérations non sécurisées et appelez-les à partir de méthodes asynchrones.
  • N’utilisez pas l’opérateur d’adresse (&) sur les paramètres ou les variables locales dans les méthodes asynchrones (CS9123). La variable n’existe peut-être pas lorsque l’opération asynchrone se termine.

Mémoires tampons de taille fixe

  • CS1641 : Un champ de mémoire tampon de taille fixe doit avoir le spécificateur de taille de tableau après le nom du champ
  • CS1642 : Les champs de mémoire tampon de taille fixe peuvent uniquement être membres de structs
  • CS1663 : Le type de mémoire tampon de taille fixe doit être l’un des éléments suivants : bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float ou double
  • CS1665 : Les mémoires tampons de taille fixe doivent avoir une longueur supérieure à zéro
  • CS1666 : Vous ne pouvez pas utiliser de mémoires tampons de taille fixe contenues dans des expressions non corrigées. Essayer d’utiliser l’instruction fixe
  • CS1708 : Les mémoires tampons de taille fixe sont accessibles uniquement par le biais de locaux ou de champs
  • CS1716 : n’utilisez pas l’attribut « System.Runtime.CompilerServices.FixedBuffer ». Utilisez le modificateur de champ « fixe » à la place
  • CS9049 : Un champ fixe ne doit pas être un champ ref

Ces erreurs se produisent lorsque vous travaillez avec des mémoires tampons de taille fixe. Les mémoires tampons de taille fixe sont des tableaux incorporés directement dans des structs et sont principalement utilisés pour les scénarios d’interopérabilité. Pour plus d’informations, consultez Mémoires tampons de taille fixe.

Pour déclarer et utiliser correctement des mémoires tampons de taille fixe :

  • Spécifiez la taille du tableau après le nom du champ à l’aide d’une constante entière positive (CS1641, CS1665).
  • Déclarez les mémoires tampons de taille fixe uniquement dans les structs, et non dans les classes (CS1642). Utilisez un tableau standard si vous avez besoin du champ dans une classe.
  • Utilisez l’un des types d’éléments pris en charge : bool, byteshortintlongcharsbyteushortuint, , , ulong, floatou double (CS1663).
  • Utilisez une fixed instruction pour épingler la structure conteneur avant d’accéder à la mémoire tampon (CS1666).
  • Accédez aux mémoires tampons de taille fixe uniquement par le biais de locaux ou de champs, et non par le biais d’expressions intermédiaires (CS1708).
  • Utilisez le fixed modificateur de champ au lieu de l’attribut System.Runtime.CompilerServices.FixedBuffer (CS1716).
  • Ne déclarez pas de mémoires tampons de taille fixe en tant que ref champs (CS9049). Les mémoires tampons de taille fixe doivent être des champs de valeur.

Pointeurs fonction

  • CS8812 : Impossible de convertir le groupe en &Method type pointeur non de fonction

Pour obtenir un pointeur de fonction, utilisez l’opérateur d’adresse avec un cast de type de pointeur de fonction explicite. N'utilisez pas l'opérateur d'adresse & pour affecter des groupes de méthodes à void* ou à d'autres types de pointeurs qui ne sont pas des pointeurs de fonction. Pour plus d’informations, consultez pointeurs de fonction.