Code sécurisé et unsafe (C# et Java)

Mise à jour : novembre 2007

Une fonctionnalité particulièrement intéressante de C# réside dans sa prise en charge du code de type unsafe. Normalement, le common language runtime (CLR) prend la responsabilité pour surveiller le comportement de code de langage intermédiaire (MSIL) Microsoft et empêche toute opération contestable. Toutefois, il peut arriver que vous souhaitiez accéder directement aux fonctionnalités de bas niveau telles que les appels d'API Win32, et vous y êtes autorisé tant que vous prenez la responsabilité de garantir que ce code fonctionne correctement. Ce type de code doit être placé à l'intérieur de blocs unsafe dans notre code source.

Le mot clé unsafe

Le code C# qui effectue des appels d'API de bas niveau, des opérations arithmétiques sur les pointeurs ou toute autre opération peu sécurisée, doit être placé dans des blocs marqués du mot clé unsafe. Chacun des éléments suivants peut être marqué comme unsafe :

  • Une méthode entière.

  • Un bloc de code entre accolades.

  • Une instruction individuelle.

L'exemple suivant montre l'utilisation de unsafe dans chacune des trois situations précitées :

class TestUnsafe
{
    unsafe static void PointyMethod()
    {
        int i=10;

        int *p = &i;
        System.Console.WriteLine("*p = " + *p);
        System.Console.WriteLine("Address of p = {0:X2}\n", (int)p);
    }

    static void StillPointy()
    {
        int i=10;

        unsafe
        {
            int *p = &i;
            System.Console.WriteLine("*p = " + *p);
            System.Console.WriteLine("Address of p = {0:X2}\n", (int)p);
        }
    }

    static void Main()
    {
        PointyMethod();
        StillPointy();
    }
}

Dans ce code, la méthode PointyMethod() entière est marquée comme unsafe, car elle déclare et utilise des pointeurs. La méthode StillPointy() marque un bloc de code comme unsafe, car ce bloc utilise encore une fois des pointeurs.

Le mot clé fixed

Dans du code safe, le garbage collector est libre de déplacer un objet pendant sa durée de vie dans le cadre de sa mission d'organisation et de condensation des ressources libres. Toutefois, si votre code utilise des pointeurs, ce comportement peut facilement engendrer des résultats inattendus, et vous pouvez donc indiquer au garbage collector de ne pas déplacer certains objets à l'aide du mot clé instruction fixed.

Le code suivant montre le mot clé fixed utilisé pour garantir qu'un tableau n'est pas déplacé par le système pendant l'exécution d'un bloc de code dans la méthode PointyMethod(). Notez que fixed est utilisé uniquement dans du code unsafe :

class TestFixed
{
    public static void PointyMethod(char[] array)
    {
        unsafe
        {
            fixed (char *p = array)
            {
                for (int i=0; i<array.Length; i++)
                {
                    System.Console.Write(*(p+i));
                }
            }
        }
    }

    static void Main()
    {
        char[] array = { 'H', 'e', 'l', 'l', 'o' };
        PointyMethod(array);
    }
}

Voir aussi

Tâches

Code unsafe, exemple

Concepts

Guide de programmation C#

Référence

Pointeurs et code unsafe (Guide de programmation C#)

Autres ressources

Langage de programmation C# pour les développeurs Java