Was ist die Bedeutung des C-/C++-Fehlers "Speicherzugriffsfehler (Speicherabzug geschrieben)"?

7 Antworten

Das ist sogenannter Segmentation fault.

Als Hacker ist dies ein sehr interessanter Fehler, denn irgendwie zeigt die Rücksprung Adresse (eip/rip) in einen invaliden Speicherblock. Mit Speicher ist der Stack, Heap oder sonst sowas im Programm Memory gemeint. Eine invalide Rücksprung Adresse sieht dann vlt so aus: 0x41414141. Wenn sie in den Stack zeigt und dieser als Non Executable gekennzeichnet isz, bekommst du übrigens auch einen Segfault.

Woher ich das weiß:Berufserfahrung

C ist eine Programmiersprache, die dem Programmierer viele Freiheiten lässt. Der Compiler führt nur weniger Überprüfungen aus. U. a. hast Du in C die Möglichekit auf den Speicher zuzugreifen und diesen manuell zu verwalten. Dabei können Fehler auftreten. Ein Klassiker wäre mit Sicherheit der Zugriff auf einen Bereich des Arrays, der nicht im zuvor deklarierten Bereich liegt. Solche Fehler sind harmlos, so lange es nicht zu weit ausgereizt wird. Dann stürzt deine Anwendung nicht ab. Du bekommst den unerlaubten Zugriff wahrscheinlich nicht einmal mit.

Ein Segmentaiton Fault, darum geht es in deiner Frage, beschreibt den Zugriff auf einen Speicherbereich, auf den deine Anwendung nicht zugreifen darf. Wenn Du eine Anwendung startest, wird dem Prozess vom Betriebssystem ein bestimmter Speicherbereich des gesamten Arbeitsspeichers zugewiesen. Diesen kann deine Anwendung nutzen. Wenn du auf Speicherbereiche zugreifen möchtest, die außerhalb liegen, dann schreitet das Betriebssystem ein.

Hier hast Du ein Beispiel um einen Segmentation Fault hervorzurufen:

main ()
{
  *(int *) 0 = 0;
}

Was passiert da?

Im Beispiel wird versucht NULL den Wert 0 zuweisen. Das ist dem Programm nicht erlaubt.

Das passiert häufig durch fehlerhafte Zeigeroperationen (z.B. keine Speicherallokation oder Schreiben außerhalb der Allokation), was dann beispielsweise dazu führen kann, dass Daten im Stack oder im Datensegment als Code interpretiert werden sollen, die aber als nonexecutable gelten, was zu einem Segmentation fault / core dumped führt.

https://www.geeksforgeeks.org/core-dump-segmentation-fault-c-cpp/

dump = Speicherabzug (dump written oder nur dump)

Mit Abzug wird nicht eine Subtraktion gemeint, sondern ein bestimmter Speicher-Platz mit Infos zu dem Fehler - der Abzug meint hier "Kopie", Kopie der fehlerhaft zugegriffenen Daten

https://de.wikipedia.org/wiki/Dump

Woher ich das weiß:eigene Erfahrung – Hobby und teilweise beruflich

Der Fehler tritt wenn die Rücksprungadresse einer Unterfunktion auf einen ungültigen Speicherblock zeigt, der keinen ausführbaren Code enthält, sondern nur Nutzdaten oder gar nichts definiertes.

Hier wird nichts abgezogen von einem Speicher, ein Speicherabzug ist ein anderes Wort für "Speicherabbild". Sprich: Der aktuelle Stand des Speichers wird für weitere Analysen in eine Datei geschrieben.

Vielleicht hast du beim scanf einfach nur irgendwo den Adressoperator & vergessen?