Was ist an gets so gefährlich? [was: Speicherallokierung unter RedHat Linux 9.0]



  • Hallo zusammen,

    ich programmiere unter RedHat Linux 9.0 mit ner i686 Architektur.

    habe ein problem zu folgendem Code Listing:

    int count_points(void)
    {
            char buffer[12];
            char *p;
            int cnt = 0;
    
            gets(buffer);
    
            for (p = buffer; *p; p++)
                    if (*p == '.')
                            cnt++;
    
            printf("Du hast %i Punkte!\n", cnt);
    
            return cnt;
    }
    
    int main(void)
    {
            puts("Wieviele Punkte willst Du haben?");
    	return count_points();
    }
    

    Nun sollte man meinen, das die höchste Anzahl an Zeichen, die man in buffer schreiben kann, 11 ist, ohne das ein Speicherzugriffsfehler gemeldet wird.
    Ich kann aber bis zu 22 oder 23 Zeichen eingeben, ohne das es kracht.
    Schreibe ich statt buffer[12] buffer[1], kracht es schon bei einer Eingabe von einem Zeichen.
    Mit char buffer[2] kracht es bei einer Eingabe von 2, mit einem char buffer[3] kann ich aber mehr als 2 Zeichen eingeben ohne das es kracht!

    Kann mir diesen Sachverhalt vielleicht irgendwer beantworten!
    Für Beiträge bedanke ich mich schon mal im Voraus! 😃

    Chiao

    <edit=kingruedi>Topic angepasst</edit>



  • das man gets nicht benutzen soll ist doch allgemein bekannt. Selbst der Compiler warnt davor 🙂

    gets liest einfach so viele Zeichen bis zu einem \n von der Standard Eingabe und schreibt diese einfach in einen String und Nullterminiert die Eingabe (also erhälst du einen gewöhnlichen C-String). Dabei wird keine Prüfung gemacht, wie viele Zeichen eingegeben wurden und wie groß der Buffer ist man: fgets(3) ist da die sichere Alternative



  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Linux/Unix in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Das die funktion gets() nicht sicher ist, weil keine Prüfung auf die Anzahl der gelesenen ASCII Zeichen erfolgt, und damit die Gefahr eines Pufferüberlaufes besteht, ist mir durchaus bewusst. Meine Frage bezieht sich eher darauf, weshalb unter RedHat Linux 9.0 es möglich ist, in einen char buffer[12] mehr als 11 ASCII zeichen zu schreiben, ohne das es während der Laufzeit zu Speicherzugriffsfehlern kommt. Unter FreeBSD wird das erkannt und bei der Eingabe von 12 Zeichen kracht es. Unter VC++ ebenfalls. Warum nicht unter Linux RedHat 9.0?

    Danke im Voraus für eine Erklärung! 😉

    Chiao



  • Hängt wahrscheinlich mit der Art der Speicherverwaltung zusammen.
    Diese wir typischerwiese mit der MMU in Pages verwaltet. Die einzelnen Pages
    können dann mit Zugriffsrechten für daten oder Programm den Programm zugeordnet werden.

    Deine beiden System verwalten die Daten minimal anders, so das in dem einen Fall eine Pageverletzung weil die Variable grad an einer Page grenze auftritt im anderen Fall nicht.



  • Weiss jemand, wie ich Linux dazu bringen kann, so wie FreeBSD oder Windows zu reagieren? In Zusammenhang mit oben gestellter Frage!🙄



  • /bin/bash0R schrieb:

    Weiss jemand, wie ich Linux dazu bringen kann, so wie FreeBSD oder Windows zu reagieren? 🙄

    Ja. Linux Shell öffnen, "format c:" eingeben und windows booten



  • @Wicked: Sach mal, hast Du eigentlich einen Schaden? Hier im ganzen Forum verbreitest Du einen Schwachsinn, der sich gewaschen hat. Das ist nicht der Sinn eines Forums 👎 😡



  • @daedlef: was machst du denn hier; ich dachte du bist auf Tour im Norden??
    @wicked: du tust mir leid ⚠ wicked==troll ⚠
    goldene Regel: erst denken, dann posten



  • @deadlef & freshman
    Habt ihr denn das große Schild am Eingang zum Forum nicht gesehen?

    Eingangsschild schrieb:

    Bitte füttern Sie nicht die Trolle!

    😉 😃

    Zurück zum eigentlichen Thema:

    /bin/bash0R schrieb:

    Weiss jemand, wie ich Linux dazu bringen kann, so wie FreeBSD oder Windows zu reagieren? 🙄

    Vermutlich gar nicht, außer du machst deine eigene Distribution, die so reagiert. Aber eigentlich seh ich auch keinen Sinn darin. Warum vermeidest du nicht einfach den Fehler?


Anmelden zum Antworten