Unsicherer Code via unsafe Zeiger in C (Teil 2)
Kommentare

Innerhalb von nicht verwaltetem Code müssen alle Aufgaben, die ansonsten von der CLR durchgeführt werden, manuell durch den Entwickler sichergestellt werden. Code, der innerhalb eines unsafe-Blocks ausgeführt

Innerhalb von nicht verwaltetem Code müssen alle Aufgaben, die ansonsten von der CLR durchgeführt werden, manuell durch den Entwickler sichergestellt werden. Code, der innerhalb eines unsafe-Blocks ausgeführt wird, wird weiterhin durch die CLR überwacht, ermöglicht jedoch die Verwendung von Zeigern. In einem unsafe-Kontext kann die CLR aber nicht alle (Typ-)Prüfungen durchführen und die Ausführung wird nicht vollständig überwacht. Die Gefahr von Laufzeitfehlern, verursacht von Typenunverträglichkeiten, ist daher innerhalb eines unsafe-Blocks größer. Bevor das unsafe-Schlüsselwort verwendet werden kann, muss der Compiler-Schalter ALLOW UNSAFE CODE aktiviert werden. Abbildung 1 zeigt diese Einstellung innerhalb der Projekteigenschaften im Build-Register.

Abb. 1: Compiler-Einstellung: unsafe-Code zulassen
Abb. 1: Compiler-Einstellung: unsafe-Code zulassen

Einsatzgebiete

Bei der Verwendung von unsafe werden einige Kontrollmechanismen der .NET-Laufzeitumgebung umgangen, daher sollte das Schlüsselwort unsafe nur in begründeten Einzelfällen verwendet werden. Folgende Anforderungen können die Verwendung von unsafe rechtfertigen:

  • Ansprechen von externen Geräten
  • Analyse von System- und Speicherzuständen
  • Umsetzung zeitkritischer Anwendungen (Real-time Application)
  • Verwendung nativer Bibliotheken (z. B. der Windows-API)

Innerhalb eines als unsafe definierten Bereichs bewegt sich der Entwickler wie in Zeiten von C bzw. C++. Die Verwendung von Zeigern ist möglich und bietet somit folgende Vorteile:

  • Die effiziente Verwendung von „alten“ Windows APIs oder die Nutzung von Bibliotheken anderer Hersteller, die auf Zeiger angewiesen sind, wird möglich. Eine Einbindung mittels DLLImport und System.IntPtr ist prinzipiell möglich, teilweise ist aber die direkte Verwendung von Zeigern effizienter.
  • Der Einsatz von Zeigern ermöglicht die direkte und schnelle Speichermanipulation. Kein anderes Verfahren ist schneller.
  • Die Ermittlung von Speicherzuständen ist nur über Zeiger möglich.

Zeiger bieten zwar für bestimmte Einsatzfelder Vorteile, dem stehen aber die folgenden Nachteile gegenüber:

  • Zeiger ermöglichen die direkte Speichermanipulation und können somit folgende Probleme hervorrufen:
    • Überschreibung von Speicherzellen und somit von Variablenwerten
    • Nicht kontrollierter Speicherverbrauch führt schnell zu einem Stack Overflow
    • Möglicher Zugriff über Prozessgrenzen hinweg gefährdet die Systemstabilität
    • Zugriff auf falsche Speicherstellen bzw. bereits gelöschte Segmente
  • Die korrekte Verwendung von Zeigern und Zeigerarithmetik ist nicht trivial
  • Der Quellcode wird komplizierter und ist schwierig auf Anhieb zu verstehen

Nicht umsonst wurde mit .NET eine verwaltete Laufzeitumgebung eingeführt, um genau die eben geschilderten Probleme zu eliminieren.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -