-
[C] segfault bei fprintf
kann mir jemand sagen, warum folgendes zwar eine Compilerwarnung erzeugt ("Format ist kein Zeichenkettenliteral, und keine Formatargumente"), aber funktioniert
Code:
fprintf(file, getenv("REMOTE_ADDR"));
und folgendes fehlerfrei kompiliert, auch "funktioniert", dabei aber einen segfault verursacht?
Code:
fprintf(file, "%s", getenv("REMOTE_ADDR"));
Der Witz ist auch, dass printf funktioniert. Das komplette Programm lautet wie folgt:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
// Client-IP ausgeben
printf("Content-type: text/plain\n\n%s", getenv("REMOTE_ADDR"));
// Falls '?test' als GET gelesen wird, speichere IP in Datei
if(!strcmp(getenv("QUERY_STRING"),"test")) {
FILE* file = fopen("/home/test/public_html/testip","w");
if(file != NULL) {
//fprintf(file, "%s", getenv("REMOTE_ADDR")); // kaputt
fprintf(file, getenv("REMOTE_ADDR")); // klappt
} else {
return(EXIT_FAILURE);
}
fclose(file);
}
return(EXIT_SUCCESS);
}
-
Funktioniert bei mir in beiden Varianten, bzw. auch wenn beide Zeilen gleichzeitig benutzt werden.
Aber am besten fragst vor dem benutzen von getenv() Rückgabewerten immer ab, so sie 0 sind.
Der strcmp() Aufruf crasht bei mir wenn QUERY_STRING nicht gesetzt ist und printf, bzw. seine Varianten, sind zumindest laut Spezifikation in diesem Fall undefiniert (bei Sun's libc Implementierung crasht 0 als Stringargument zum Beispiel immer).
Ciao,
_