Kolumne: C# im Fokus

Unsicherer Code via unsafe Zeiger in C
Kommentare

Das Schlüsselwort unsafe erlaubt die Umsetzung von – einfach übersetzt – „unsicherem“ Code. Das bedeutet aber nicht, dass die entstehende Implementierung nicht funktionsfähig oder fehleranfälliger ist. Technisch gesehen deklariert unsafe ein Codeblock, der nicht unter der vollständigen Kontrolle der .NET-Ausführungsumgebung steht.

Wie schon erwähnt, wird mit dem Schlüsselwort unsafe ein unsicherer Codeblock eingeleitet. Der durch unsafe definierte Bereich ist dabei aber nicht zu verwechseln, wie im weiteren Verlauf noch deutlich wird, mit nicht verwaltetem Code (Unmanaged Code). Für unsafe existieren insgesamt drei sprachliche Übersetzungen: unsicher, gefährlich und nicht sicher, wobei die letztere am ehesten auf die Funktionsweise des Schlüsselworts zutrifft. Mit unsafe werden direkte Zeiger- und Speichermanipulationen innerhalb der .NET-Laufzeitumgebung möglich. Code innerhalb eines unsafe-Blocks ist als „nicht sicher“ einzustufen, da nicht alle .NET-CLR-(Common-Language-Runtime-)Prüfungen, z. B. Codeverifizierungen, durchgeführt werden können. Somit besteht die Gefahr, dass typische Typfehler erst zur Laufzeit auftreten. Zudem kann das Schlüsselwort unsafe nur in so genannten „Full-Trust“-Umgebungen bzw. Assemblies verwendet werden. Eine Verwendung von unsafe in Silverlight oder teilweise vertrauenswürdigen Assemblies (Partial Trust Assembly) ist daher nicht möglich.

Managed Code, Unmanaged Code und unsafe

Zu unterscheiden ist noch zwischen verwaltetem Code (Managed Code), nicht verwaltetem Code (Unmanaged Code) und Code innerhalb eines unsafe-Blocks. Typischerweise fällt jedes in C# oder auch in jeder anderen .NET-konformen Programmiersprache geschriebene Programm zunächst in die Kategorie von verwaltetem Code. Verwalteter Code wird während der Ausführung durch die CLR überwacht. Die CLR übernimmt dabei u. a. folgende Aufgaben:

  • Speicherverwaltung für Objekte
  • Typprüfung
  • Garbage Collection (Speicherfreigabe)

Nicht verwalteter Code läuft nicht unter der Kontrolle der CRL, sodass die CLR auch nicht die Ausführung überwachen kann. Nicht verwalteter Code kommt zur Ausführung, wenn z. B. eine native Windows-API-Funktion aus der kernel32-Bibliothek aufgerufen wird (Listing 1).

Listing 1

class MyClass 
{     
    [DllImport("someUnmanagedDll.dll")]
    static extern int UnManagedCodeMethod(string msg, string title);
    public static void Main()      
    {
    UnManagedCodeMethod("calling unmanaged code", "hi");
    }
}  
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -