Segmentation Fault bei Zahl?
-
Hallo Zusammen,
Hab mir nun einen kleinen Parser geschrieben, der mir verschiedene Variablen aus einem PHP-Serialisierten String rauskopiert.
Bei String funktioniert meine Methode wunderbar, aber sobald eine Zahl im String ist, bekomm ich ein Segmentation fault, die Stelle an der er Austeigt hab ich markiert!
hier mein Code:
// Hier wird eine Char Zahl zum Integer gemacht int string2int(char* digit) { int result = 0; if (digit == NULL) result = 0; else{ int minus = 0; while ((*digit >= '0' && *digit <='9') || *digit == '-') { if(*digit == '-') minus = 1; else result = (result * 10) + (*digit - '0'); digit++; } if (minus == 1) result = result*(-1); if(*digit != 0) { return 0; } } return result; } void unserialize(char* string, char* search) { char look_for[1000]; char length[20]; int start_copy; int laenge; sprintf(length, "%d", strlen(search)); strcpy(look_for, "s:"); strcat(look_for, length); strcat(look_for, ":"); strcat(look_for, "\""); strcat(look_for, search); strcat(look_for, "\""); strcat(look_for, ";"); printf("OUTPUT:\nString: %s\n", look_for); // Unseren Serialized ueberspringen, da der Content wichtig ist! int start = strlen(look_for); // Nun nach unserem Zusammen gebastelten String suchen und Startposition setzen char* temp = string; char* search_anfang = strstr(temp, look_for) + strlen(look_for)+2; //in dieser Zeile bekomm ich den Sigfault: char* search_ende = strstr(search_anfang, "\";"); // size_t to_copy = (search_ende-1 - search_anfang); search_anfang[1+to_copy] = '\0'; laenge = string2int(search_anfang); printf("OUTPUT:\nString: %s\n", search_anfang+laenge+3); }
Es wird bei char* string das hier übergeben:
s:11:"REMOTE_ADDR";s:12:"217.82.66.41";Bei Search übergebe ich "REMOTE_ADDR" nun sollte ich über den printf eigtl. die IP kriegen, aber krieg leider ein Segfault. Wenn ich nun einen String ohne Zahl nehm wie XXX.XXX.XXX.XXX klappts??
Hat jemand Hilfe ???
-
du machst das ein wenig sehr umständlich...
kannst du mal sagen wie genau dein eingabe string aussehen kann (also was es da alles für möglichkeiten geben soll und ob es eine feste position (also z.b. immer 3 zeichen nach xyz) oder eine feste zeichenfolge gibt nach dem deine IP adresse erscheint?
-
Hallo!
Da mein String generell immer ein PHP Serialized Code ist, ist er in der Struktur fest aber im Inhalt Dynamisch.
Das ganze baut sich generell immer so auf und ändert sich auch im Aufbau/Struktur nicht:
Beispiel:
s:XX:"Variable_Name";s:XX:"Inhalt_von_Variable";Das XX gibt jeweils immer die Länge von den Werten in Anführungszeichen "" an.
Wenn s:XX:"Variable_Name"; nun einen Integer Wert (Wirklicher Integer) enthält, ändert sich der Aufbau gering fügig.Wenn s:XX:"Variable_Name"; nun ein Integer Wert von 5 hat sieht das so aus:
s:XX:"Variable_Name";i:XX:5;Das wars im großen und ganzen!
Also eigentlich recht Simpel
-
in dem fall würde ich z.b. versuchen einfach den string stück für stück nach s: druchsuchen (mit strstr) und dann schauen ob da im anschluss an s: was sinnvolles steht... wen ja merken und weiter gehts mit strstr an der stelle wo du aufgehört hast...
um dann deine ip aus nem teilstring zu parsen kannst du dann sscanf verwenden...
deine string2int (die du nicht mehr brauchst wenn du sscanf verwendest) ist auch ein wenig kompliziert geschrieben... >='0' und <='9' liefert dir auch die funktion isdigit... und das minus müsstest du nur einmal am anfang prüfen...
wenn wie gesagt ne zahl drin ist würde ich die auch nicht selber ausrechnen lassen sonderen einfach sscanf verwenden
-
Ja gut, da hast du recht das die string2int funktion etwas umständlich geschrieben ist, da es ja noch atoi gibt
Das ganze war ja vorerst nur für Testzwecke geschrieben, sauberer hätte ich das dann schon gemacht.. wenn ich nicht dieses komische Zahlen Problem hätte!
-
Hmm Okay, nach bischen Suchen ist mir aufgefallen das es wohl an dem _ liegen muss das ich ein Segmenation fault krieg.... ??
-
@Sany
Wenn du schon sprintf() verwendest um die Länge in ein char-Array zu bekommen, warum verwendest du dann sprintf() nicht auch um look_for zu füllen??Dein Segfault kommt vermutlich daher, dass strstr() look_for in temp nicht findet und darum 0 (NULL) zurückgibt. Zusammen mit der Länge von look_for+2 ergibt das einen Ort im Speicher auf den du weder Schreib- noch Lesezugriff hast und genau auf diesem Bereich machst du einen Lesezugriff, der vom Betriebssystem mit einem Segmentation Fault quittiert wird.
Also starte am besten mal deinen Debugger und schau dir den Inhalt deiner Variablen an, ob da alles passt.
Zusätzlich solltest du aber trotzdem abprüfen, ob strstr() 0 zurückgibt - Teilstring nicht gefunden - und dann entsprechend den Fehlerfall verarbeiten.Dann ist mir noch was aufgefallen. Du Definierst die Variable start und initialisierst sie mit der Länge von look_for; verwendest die Variable aber nicht mehr in deinem Code. Außerdem ist es in ANSI-C nicht zulässig Variablen mitten im sog. Block zu Deklarieren, nur am Anfang eines Blockes (das betrifft auch die Variablen bzw. Zeiger danach).
-
Hallo,
Also wie du recht hattest, bei search_anfang war NULL drin, hab das jetzt ausgebügelt..
Nun rennt es wie blöde