Pourquoi un tampon de taille fixe (tableaux) doivent être dangereux?
-
04-10-2019 - |
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?
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.