Zeiger inkrementieren



  • ja, ein undefinierter, zufälliger wert vom typ char steht da drin.



  • fehlerfuchs schrieb:

    ja, ein undefinierter, zufälliger wert vom typ char steht da drin.

    sagen wir mal: wir greifen als 'char' darauf zu. was sich wirklich dort befindet, wissen wir nicht.
    🙂



  • +fricky schrieb:

    sagen wir mal: wir greifen als 'char' darauf zu. was sich wirklich dort befindet, wissen wir nicht.
    🙂

    jo, was dort ist wissen wir nicht.
    das kann man sich auch so hinbiegen: es steht eine zufällige 1/0 kombination drin. diese kombination lässt sich in jedem fall als ein char interpretieren. hi-hi.

    im prinzip ist es ja so:
    - der speicherplatz ist nicht definiert ( von keiner anderen variable reserviert ).
    - darum ist auch der wert undefiniert.
    - dank der fehlertoleranz/ignoranz 😃 von c wird dennoch eine adresse in pc nach dessen inkrementierung geschrieben.
    - der compiler stolpert dann über *pc, guckt nach und: ahaaaa, da ist ein char zu interpretieren und schwupp-kopiert nen zufallschrottwert in *pc rein. 🙂



  • ^^oder: an der adresse befindet sich überhaupt kein speicher und die cpu löst eine exception aus, z.b. den gefürchteten 'data abort' bei ARM prozessoren.
    🙂



  • da hamwa den salat! 🙂



  • +fricky schrieb:

    ^^oder: an der adresse befindet sich überhaupt kein speicher und die cpu löst eine exception aus, z.b. den gefürchteten 'data abort' bei ARM prozessoren.
    🙂

    die hab ich so oft gesehen 😉



  • So tief bin ich noch nicht in die Bitwelt eingetaucht. Ihr seid super!



  • supertux schrieb:

    +fricky schrieb:

    ^^oder: an der adresse befindet sich überhaupt kein speicher und die cpu löst eine exception aus, z.b. den gefürchteten 'data abort' bei ARM prozessoren.
    🙂

    die hab ich so oft gesehen

    die kann sogar nützlich sein. ich hab' sie mal benutzt, um eine speichererweiterung zu implementieren. 1MB unbenutzter adressraum wird im exception-handler auf einen seriellen RAM-baustein gemappt. ist zwar um ein vielfaches langsamer, als zugriffe auf internes RAM, aber für den code völlig transparent.
    🙂



  • +fricky schrieb:

    supertux schrieb:

    +fricky schrieb:

    ^^oder: an der adresse befindet sich überhaupt kein speicher und die cpu löst eine exception aus, z.b. den gefürchteten 'data abort' bei ARM prozessoren.
    🙂

    die hab ich so oft gesehen

    die kann sogar nützlich sein. ich hab' sie mal benutzt, um eine speichererweiterung zu implementieren. 1MB unbenutzter adressraum wird im exception-handler auf einen seriellen RAM-baustein gemappt. ist zwar um ein vielfaches langsamer, als zugriffe auf internes RAM, aber für den code völlig transparent.
    🙂

    ich weiß, es kann sehr nützlich sein. Ich hatte einen fiessen Bug in meinem Context-Switch Code, den ich ich erst durch eine abort excepction entdeckt hatte. Ohne dieses abort wäre ich nie drauf gekommen. Ein anderes Mal habe ich den Stack-Pointer für eine Sondertask falsch berechnet und nach 2 Stunden Laufzeit *kraaach* data abort. Ohne diese Exception hätte ich diesen Bug nicht einmal vermutet.





  • +fricky schrieb:

    supertux: falls du's noch nicht kennst: http://www.design-reuse.com/articles/14079/how-to-use-arm-s-data-abort-exception.html
    🙂

    cool, kannte es gar nicht, das werde ich mir in Ruhe anschauen. Was mir jedenfalls sofort gefallen hat: "Computers are like Old Testament gods; lots of rules and no mercy."


Anmelden zum Antworten