Problem: getchar() in char casten



  • Hallo,
    ich habe gestern im POSIX-Standard mal nach getchar() nachgeschlagen.
    Aus verschiedenen Gründen kann die Funktion EOF zurückgeben, welches ein negativer int-Wert ist. Speichert man nun das Ergebnis in ein char, hat man ein Problem: char muss nicht zwingend signed sein, sondern kann auch unsigned sein, weil das im Standard nicht vorgegeben ist.
    Wenn ich also das Ergebnis in ein char speichere und das mit EOF vergleiche, welches ja ein int ist, sagt POSIX folgendes dazu:

    If the integer value returned by getchar() is stored into a variable of type char and then compared against the integer constant EOF, the comparison may never succeed, because sign-extension of a variable of type char on widening to integer is implementation-defined.

    Dem Problem wollte ich mich nicht selber gegenüberstellen, sondern wollte das dem Tool splint überlassen, um zu gucken, was es zu der potentiellen Schwachstelle sagt:

    int main()
    {
        char c = (char) getchar();
    
        if (c == EOF)
        {
            printf("EOF!\n");
        }
        else
        {
            printf("%c\n", c);
        }
    
        return 0;
    }
    

    Splint sagt dazu:

    getchar-test.c:5:9: Operands of == have incompatible types (char, int):
                           c == EOF
      To make char and int types equivalent, use +charint.
    
    Finished checking --- 1 code warning
    

    Was ist nun mit +charint gemeint?

    Danke im Voraus!

    L. G.
    Steffo


  • Mod

    Steht doch schon da: Macht char und integer äquivalent.

    Google: splint charint



  • Andererseits kannst du auch c als int definieren.

    int c = (char) getchar();
    

    Und schon funktioniert es.



  • Steffo schrieb:

    Hallo,
    ich habe gestern im POSIX-Standard mal nach getchar() nachgeschlagen.
    Aus verschiedenen Gründen kann die Funktion EOF zurückgeben, welches ein negativer int-Wert ist. Speichert man nun das Ergebnis in ein char, hat man ein Problem: char muss nicht zwingend signed sein, sondern kann auch unsigned sein, weil das im Standard nicht vorgegeben ist.

    Das ist doch relativ esoterisch. Viel relevanter ist das Problem, dass der Wertebereich von char in der Regel kleiner als der von int ist. Dann ist (char)EOF ein normales Zeichen (das berühmte ÿ), das in einer Datei vorkommen kann, und das man dann nicht mehr von EOF unterscheiden kann.

    Steffo schrieb:

    Was ist nun mit +charint gemeint?

    Eine Option beim Aufruf von splint. Keine Ahnung, was sie genau macht, aber vermutlich nur, dass alle Checks ausgelassen werden, die zu Fehlermeldungen wie deiner führen.



  • DirkB schrieb:

    Andererseits kannst du auch c als int definieren.

    int c = (char) getchar();
    

    Und schon funktioniert es.

    Aua! Das verdient Schläge. 😮 🙄 😡



  • Achso, das ist ne Option bei splint. 😃
    Gut, um meinem EOF-Problem zu begegnen, muss ich quasi mit signed char arbeiten, oder?

    L. G.
    Steffo



  • Bashar schrieb:

    DirkB schrieb:

    Andererseits kannst du auch c als int definieren.

    int c = (char) getchar();
    

    Und schon funktioniert es.

    Aua! Das verdient Schläge. 😮 🙄 😡

    Und wie kann ich dann zeichenweise in einen String-Array einlesen? Letztendlich kann ich einen int-Array in printf nicht als String ausgeben.
    Wie gehe ich also vor?

    L. G.
    Steffo



  • Bashar schrieb:

    Aua! Das verdient Schläge. 😮 🙄 😡

    (ganz viele zensierte Wörter) Du darfst auch den Zaunpfahl nehmen. 😡



  • Steffo schrieb:

    Und wie kann ich dann zeichenweise in einen String-Array einlesen? Letztendlich kann ich einen int-Array in printf nicht als String ausgeben.
    Wie gehe ich also vor?

    int c =  getchar();
    

    Das c kannst du dann dem Arrayelement zuweisen.

    Also erst int lesen und dann im Array ablegen.



  • OK, alles klar.
    THX.


Anmelden zum Antworten