Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] segfault bei fprintf



SeeksTheMoon
11-04-2012, 21:49
kann mir jemand sagen, warum folgendes zwar eine Compilerwarnung erzeugt ("Format ist kein Zeichenkettenliteral, und keine Formatargumente"), aber funktioniert


fprintf(file, getenv("REMOTE_ADDR"));

und folgendes fehlerfrei kompiliert, auch "funktioniert", dabei aber einen segfault verursacht?


fprintf(file, "%s", getenv("REMOTE_ADDR"));

Der Witz ist auch, dass printf funktioniert. Das komplette Programm lautet wie folgt:


#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);
}

anda_skoa
12-04-2012, 11:46
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,
_