Kann unsicherer Code in C # Speicherbeschädigung verursachen?

8

Grundsätzlich wird die Speicherbeschädigung durch das Überschreiben von Speicher verursacht, den Sie nicht überschreiben sollten. Ich frage mich, ob dies mit unsicherem Code in C # möglich ist (d. H. Nicht durch Aufrufen von externem nicht verwaltetem Code). Ich sehe zwei mögliche Fälle:

  • Zugriff auf einen Nullzeiger - & gt; Gefangen von der CLR, wirft ein NullReferenceException
  • Zugriff auf einen Zeiger auf einen ungültigen zufälligen Speicherort - & gt; Trapped by the CLR, löst eine AccessViolationException
  • aus

In beiden Fällen scheint die Laufzeitumgebung die mögliche Speicherbeschädigung zu erkennen und zu verhindern. Ist es daher möglich, Speicher von C # mit unsicherem Code zu beschädigen? Und ist es folglich sicher, AccessViolationExceptions von unsicherem Code abzufangen?

    
Asik 21.08.2013, 19:43
quelle

4 Antworten

9
  

Zugriff auf einen Zeiger auf einen ungültigen zufälligen Speicherort

Wenn es gelesen wird, ist es sicher. Wenn es ein Schreibvorgang war, ist es unsicher, ob der Speicherort zufällig gültig war, aber Sie hatten ihn nicht. Sie werden über zufällige Speicherorte kritzeln.

  

Und als Konsequenz, ist es sicher, AccessViolationExceptions von unsicheren Code abzufangen?

Nein, weil diese Ausnahme Ihnen a) anzeigt, dass Sie einen Fehler haben und b) der Speicher möglicherweise beschädigt ist und nicht repariert werden kann. Fang es und zerreiße den Prozess so schnell wie möglich.

    
usr 21.08.2013, 19:46
quelle
10

Sie verpassen die große Kugel:

  • Speicherzugriff und nicht Erzwingen einer AccessViolationException.

Was sehr ist, gibt es in einem .NET-Programm immer viel beschreibbaren Speicher. Wenn man das Element über das Ende eines Arrays hinaus schreibt, bombardiert es selten. Der Speicherschutz ist bei Speicherseitenbegrenzungen 4096 Byte unter Windows granular. Der .NET GC macht das deutlich höher, die generationellen Heap-Segmente sind schöne große Teile der VM. AVEs zu fangen ist sehr unklug.

Ein Code zum Spielen:

%Vor%

Überschwingt um etwa 1,5 Megabyte.

    
Hans Passant 21.08.2013 20:13
quelle
6
  

Kann unsicherer Code in C # Speicherbeschädigung verursachen?

Antwort ist ja!, Betrachten Sie das folgende Beispiel tut das

%Vor%

CLR kann dies möglicherweise verhindern oder nicht.

  

Nicht alle Lesevorgänge oder Schreibvorgänge durch ungültige Zeiger führen zu Zugriffsverletzungen. Daher weist eine Zugriffsverletzung normalerweise darauf hin, dass mehrere Lese- oder Schreibvorgänge über ungültige Zeiger aufgetreten sind und der Speicher möglicherweise beschädigt ist.

Von Accessviolationexception-Dokumentation

    
Sriram Sakthivel 21.08.2013 19:55
quelle
2

Der Speicher-Schreibvorgang, der die AccessViolationException verursacht hat, ist nicht eingetreten, es macht nichts.

Allerdings: Die Tatsache, dass es versucht hat, an einen falschen Speicherort zu schreiben, ist ein sehr starker Hinweis darauf, dass es zuvor ungültige Schreiboperationen gegeben hat (da Ihr Code fehlerhaft ist), und diese Schreibvorgänge könnten auf beschreibbare Speicherorte verweisen aber sollten nicht geändert werden.

    
Timbo 21.08.2013 19:50
quelle

Tags und Links