Question

Le mot Let Je veux avoir un type de valeur de 7 octets (ou 3 ou 777).

Je peux définir comme ça:

public struct Buffer71
{
    public byte b0;
    public byte b1;
    public byte b2;
    public byte b3;
    public byte b4;
    public byte b5;
    public byte b6;
}

Une façon plus simple de le définir est d'utiliser un tampon fixe

public struct Buffer72
{
    public unsafe fixed byte bs[7];
}

Bien sûr, la deuxième définition est plus simple. Les mensonges de problème avec le mot-clé dangereux qui doivent être fournis pour les tampons fixes. Je comprends que cela est mis en œuvre en utilisant des pointeurs et donc dangereux.

Ma question est pourquoi doit-il être dangereux? Pourquoi ne peuvent-C # fournir des tableaux de longueur de constante arbitraire et les garder comme un type de valeur au lieu d'en faire un tableau de type de référence C # ou des tampons dangereux?

Était-ce utile?

La solution

Parce qu'un « tampon fixe » est pas un tableau réel. Il est un type de valeur personnalisée, la seule façon de générer un dans le langage C # que je sais. Il n'y a aucun moyen pour le CLR pour vérifier que l'indexation du tableau se fait de manière sûre. Le code n'est pas vérifiable soit. La démonstration la plus graphique de ceci:

using System;

class Program {
    static unsafe void Main(string[] args) {
        var buf = new Buffer72();
        Console.WriteLine(buf.bs[8]);
        Console.ReadLine();
    }
}
public struct Buffer72 {
    public unsafe fixed byte bs[7];
}

Vous pouvez accéder arbitrairement le cadre de pile dans cet exemple. La technique d'injection de débordement de tampon standard serait disponible pour un code malveillant à patcher l'adresse de retour de la fonction et forcer votre code pour accéder à un emplacement arbitraire.

Oui, c'est tout à fait dangereux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top