Anzeige:
Ergebnis 1 bis 2 von 2

Thema: [C] segfault bei fprintf

  1. #1
    Registrierter Benutzer Avatar von SeeksTheMoon
    Registriert seit
    22.02.2002
    Beiträge
    762

    [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);
    }
    I haven't lost my mind - It's somewhere on a backup-disc

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •