C++ Primer Aufgabe 4.31



  • Ich denke mal, dass da auf Buffer Overflows angespielt wird.

    char buffer[32];
    std::cin >> buffer;
    

    Und dann schau mal, was passiert, wenn du etwas längeres, als 32 Zeichen eingibst..



  • Die Aufgabe finde ich aber nicht so gut. Ich denke, so schnell findet man nicht heraus, dass da undefiniertes Verhalten im Spiel ist, wenn man davon nie gehört hat...



  • Nexus schrieb:

    Die Aufgabe finde ich aber nicht so gut. Ich denke, so schnell findet man nicht heraus, dass da undefiniertes Verhalten im Spiel ist, wenn man davon nie gehört hat...

    Darum geht es ja. 😉 - Normalerweise bekommt man eine Fehlermeldung, dass ausserhalb von gültigem Bereich zugegriffen wurde.
    Auch wenn das direkt nicht viel bringt nützt es bestimmt, wenn man irgendwann den gleichen Fehler bekommt und keine Ahung hat, wie der geschehen ist. Dann weiss man wenigstens, dass es um etwas solchiges (oder zumindest ähnliches) geht..



  • Das ist es ja, was ich bezweifle. Sagen wir, man probiert es fünf Mal aus, erhält jedes Mal eine Speicherzugriffsverletzung. Dann arbeitet man an einem grösseren Projekt, schreibt über Arraygrenzen und richtet damit Schlimmeres an, zum Beispiel andere Daten oder sogar Rücksprungadressen überschreiben. Aber man denkt jetzt: "Nein, Array-Überlauf kann nicht sein, das würde ja eine Zugriffsverletzung geben".



  • Nexus schrieb:

    Das ist es ja, was ich bezweifle. Sagen wir, man probiert es fünf Mal aus, erhält jedes Mal eine Speicherzugriffsverletzung. Dann arbeitet man an einem grösseren Projekt, schreibt über Arraygrenzen und richtet damit Schlimmeres an, zum Beispiel andere Daten oder sogar Rücksprungadressen überschreiben. Aber man denkt jetzt: "Nein, Array-Überlauf kann nicht sein, das würde ja eine Zugriffsverletzung geben".

    Ich glaube kaum, dass eine Rücksprungadresse zufällig mit einer gültigen Addresse überschrieben wird. 😉 - Das wäre wie ein 6er im Lotto.

    Ansonsten macht man solche Eingaben auch nicht in einen festen Puffer. Da wäre das mit std::string bei weitem besser..



  • drakon schrieb:

    Ich glaube kaum, dass eine Rücksprungadresse zufällig mit einer gültigen Addresse überschrieben wird. 😉 - Das wäre wie ein 6er im Lotto.

    Es muss ja keine gültige Adresse sein. Aber ausschliessen darf man es nie... :p

    drakon schrieb:

    Ansonsten macht man solche Eingaben auch nicht in einen festen Puffer. Da wäre das mit std::string bei weitem besser..

    Ja, das ist klar. Aber ich finde das eben grundsätzlich keine gute Aufgabe.

    Viele Dinge kann man in C++ durch Ausprobieren herausfinden. Aber Operationen, die undefiniertes Verhalten verursachen, gehören eben nicht dazu. Da sollte einem lieber gesagt werden, dass das Verhalten undefiniert ist, und eben je nachdem alles bestens gehen kann, oder ein schwarzes Mini-Loch entsteht.



  • Nexus schrieb:

    Viele Dinge kann man in C++ durch Ausprobieren herausfinden. Aber Operationen, die undefiniertes Verhalten verursachen, gehören eben nicht dazu. Da sollte einem lieber gesagt werden, dass das Verhalten undefiniert ist, und eben je nachdem alles bestens gehen kann, oder ein schwarzes Mini-Loch entsteht.

    Ich kenne das Buch nicht und gehe eigentlich schwer davon aus, dass die Problematik danach angesprochen wird.. Sonst macht das ganze ja auch nicht viel Sinn.. 🙄



  • Das geht aber komischerweise:

    int main()
    {
        char a[5];
        cin >> a; //Eingabe: Blaumilchkanal
        cout << a << endl;
    
        return 0;
    }
    

    Verstehe nicht warum?

    MfG
    Stromberg



  • Stromberg schrieb:

    Verstehe nicht warum?

    Eben, weil das Verhalten undefiniert ist. Es kann funktionieren, muss aber nicht. 😉



  • Okay, gecheckt.


Anmelden zum Antworten