Pointer auf undefinierten Bereich...



  • Na Moment, wenn ich statt

    testi *f
    
    int *f
    

    schreibe, kommt sehr wohl ein Absturz.
    Nein als Release habe ich es nicht kompiliert, es ist auch kein richtiges Projekt. Nur, wie gesagt, gcc und vc erzeugen dieselbe Ausgabe.



  • D-U-D-E schrieb:

    [...] kommt sehr wohl ein Absturz.

    Warum fällt es eigentlich den meisten so schwer, "undefiniert" zu verstehen?

    Es ist nicht definiert, was passiert. Es könnte abstürzen, es könnte Deine CPU zum schmelzen bringen, es könnte in China einen Sack Reis zum umstürzen bringen. Sprich: Es macht einfach nicht das, was Du möchtest (oder vielleicht sogar das). Was es aber macht, ist nicht definiert.



  • LordJaxom schrieb:

    ..., keine Abstürze oder Fehlermeldungen.

    :p



  • D-U-D-E schrieb:

    LordJaxom schrieb:

    ..., keine Abstürze oder Fehlermeldungen.

    :p

    Ein Lesen aus Speicher, der Dir nicht gehört, erzeugt keinen Absturz (in dem Sinne, dass die Laufzeitumgebung sagt "ah, kenn' ich nicht, peng!"). Dass trotzdem ein Absturz stattfinden kann (aber nicht muss), weil z.B. die entsprechende Speicherseite geschützt ist (was ein Implementierungsdetail und vom Betriebssystem und der Hardware abhängig wäre) hat niemand bestritten :p

    Undefiniert heißt eben "alles kann, nichts muss".



  • LordJaxom schrieb:

    es könnte in China einen Sack Reis zum umstürzen bringen.

    Könnte es auch einen Atomkrieg auslösen?



  • char *t = 0;
    
        if (!t)
            t = "test";
        if (!strncmp(t, "test", 4))
            printf("gleich, und test bestanden");
        else
            printf("ungleich, aber test bestanden");
    

    Dieser Code funktioniert auch und ich würde das gerne abschalten (wenn das denn geht). Gibts da irgendwelche Flags? Hab schon versucht das Warning Level hochzuschrauben, aber das scheint nicht viel zu bewirken...



  • D-U-D-E schrieb:

    Hab schon versucht das Warning Level hochzuschrauben, aber das scheint nicht viel zu bewirken...

    Wovor soll denn da deiner Meinung nach gewarnt werden?



  • Vor Schreibzugriffen auf Speicher, der mir nicht gehört. Keine Ahnung, ich probier einfach rum und finde nichts.



  • D-U-D-E schrieb:

    Vor Schreibzugriffen auf Speicher, der mir nicht gehört.

    Das passiert in diesem Code aber gar nicht.

    Die einzigen Schreibzugriffe sind die Zuweisungen an t.

    Allgemein ist es in C deine Aufgabe, zu verhindern, dass dein Programm undefiniertes Verhalten zeigt. Wenn du willst, dass dir das der Compiler abnimmt, solltest du eine andere Programmiersprache benutzen.



  • D-U-D-E schrieb:

    Vor Schreibzugriffen auf Speicher, der mir nicht gehört.

    Wo ist in deinem Beispiel ein fehlerhafter Speicherzugriff?!

    cheers, Swordfish



  • Immer mit der Ruhe. Meine Frage war einfach, ob man dem Compiler sagen kann, daß an solchen Stellen ein Absturz kommen soll. Ein einfaches "nein" hätte es auch getan.



  • D-U-D-E schrieb:

    Immer mit der Ruhe. Meine Frage war einfach, ob man dem Compiler sagen kann, daß an solchen Stellen ein Absturz kommen soll.

    Nein, deine Frage war, wie man "abschalten" kann, dass ein anscheinend korrekter Code nicht mehr "funktioniert". Dass das Unverständnis hervorruft und Nachfragen bewirkt, sollte dich nicht wundern.



  • D-U-D-E schrieb:

    Immer mit der Ruhe. Meine Frage war einfach, ob man dem Compiler sagen kann, daß an solchen Stellen ein Absturz kommen soll. Ein einfaches "nein" hätte es auch getan.

    keiner greift dich an, aber du scheinst etwas mit dem Speicherzugriff nicht verstanden zu haben und wenn man jemanden helfen will, muss man manchmal (unangenehme) Fragen stellen, damit man weiß, was Sache ist. Laut deinen letzten Posts sehen wir, dass du da etwas verwirrt bist (z.b. vor Schreibzugriffe schützen, die es gar nicht gibt) und wollten herausfinden, was du genau meinst.



  • Mein Gedankengang war folgender: da solche Anweisungen undefiniertes Verhalten hervorrufen, muß das dann wahrscheinlich vom Compiler geregelt werden (was dann von Compiler zu Compiler variieren kann). Beim Compiler von Microsoft ist es nun so, daß du scheinbar eine Speicherstelle zugewiesen kriegst, allerdings bin ich mir nicht sicher, ob dieser Speicher im Laufe des Programms nicht einfach überschrieben wird. Deswegen würde ich solches "Verhalten" am liebsten "abstellen" und einen Absturz produzieren. Meine Frage war nun einfach, ob es so ein Flag gibt oder nicht.



  • D-U-D-E schrieb:

    da solche Anweisungen undefiniertes Verhalten hervorrufen

    bitte schreib doch mal klar und deutlich hin, welche anweisungen du meinst.
    der code, den du gepostet hast, ruft kein undefiniertes verhalten hervor.



  • suma dartson schrieb:

    D-U-D-E schrieb:

    da solche Anweisungen undefiniertes Verhalten hervorrufen

    bitte schreib doch mal klar und deutlich hin, welche anweisungen du meinst.
    der code, den du gepostet hast, ruft kein undefiniertes verhalten hervor.

    Willst du mir sagen, daß

    char *t = 0;
    
        if (!t)
            t = "test";
    

    standardkonform ist? Jetzt bin ich allerdings wirklich verwirrt.



  • D-U-D-E schrieb:

    Willst du mir sagen, daß

    char *t = 0;
    
        if (!t)
            t = "test";
    

    Das ist aus dem Grunde standardkonform, weil das Ergebnis von "test" ein Zeiger auf ein Zeichenliteral ist, welches die gesamte Programmlaufzeit überdauert.



  • D-U-D-E schrieb:

    Willst du mir sagen, daß

    char *t = 0;
    
        if (!t)
            t = "test";
    

    standardkonform ist? Jetzt bin ich allerdings wirklich verwirrt.

    Wo siehst du denn da ein Problem?

    t wird mit Null initialisert, und verweist am Ende auf das Stringliteral "test".



  • Also wird das Literal "test" in den Speicher gelegt und t darauf umgebogen, richtig?



  • Das hat zwar nichts mit biegen zu tun, aber ja: t wird mit NULL initialisert, und verweist am Ende auf das Stringliteral "test" . 😉

    cheers, Swordfish


Anmelden zum Antworten