StringLoader





  • Frage: "•Is there any way to work around this problem?"
    Antwort: "You could use a union to represent the memory you need to reinterpret"



  • Kommentar zur akzeptierten Antwort:

    Just a warning, that it's unspecified behaviour to use an union by writing to one member and reading from another, according to the C++ standard. So it may work, it may not.

    Bitte auch beachten dass C++ hier andere Regeln als C hat.
    Bei C ist der Umweg über ne union offiziell OK. Mit C++ ist er offiziell (=laut Standard) nicht OK. Wobei viele (alle?) C++ Compiler es trotzdem unterstützen.



  • Also mMm. beste Option ist memcpy .
    Wenn du memcpy unbedingt vermeiden willst nimm ne union .
    Auf jeden Fall nicht reinterpret_cast .



  • hustbaer schrieb:

    Also mMm. beste Option ist memcpy .
    Wenn du memcpy unbedingt vermeiden willst nimm ne union .
    Auf jeden Fall nicht reinterpret_cast .

    Ich muss zwingend casten. Du hast mir doch weiter oben erklärt, dass ich das Feld pwsz nicht benutzen darf, da ich es nicht beschrieben habe. Also ist das einfach nur noch so da, wegen der Ausrichtung.

    Weißt du eigentlich noch, welches Problem Du mir einreden möchtest?



  • Ich will dir gar kein Problem "einreden".
    Ich versuche dir klarzumachen was der C++ Standard über den Code sagt den du schreibst.
    Welche Variante aus welchem Grund UB ist hab ich auch schon beschrieben.

    Wenns dich nicht interessiert, dann lass deinen Code so wie er ist.
    Wenn schon, dann google die Stichworte die hier gefallen sind einfach selbst.

    ps: Was ich mit meinem letzten Beitrag gemeint hatte: der union -Trick ist "weniger falsch" als der reinterpret_cast . Oder eben anders gesagt: der reinterpret_cast ist so ziemlich die schlimmste denkbare Variante.



  • hustbaer schrieb:

    Wenn schon, dann google die Stichworte die hier gefallen sind einfach selbst.

    Das werde ich ganz sicher nicht tun. Wenn Du hier UB siehst, wirst Du schon Ross und Reiter direkt beim Namen nennen müssen. Ansonsten gehe ich weiter davon aus, dass Du das nicht existierende Problem selber nicht so ganz verstehst. Mit "IIRC" und "vielleicht 'ne Grauzone" und einem Link, der mich bestätigt, überzeugst Du mich jedenfalls nicht.

    Aber lassen wir das. Ich mache sowieso was ich meine machen zu müssen.



  • Ja, mach was du willst. Interessiert mich nicht wirklich. Wenn du mir nix glauben willst, dann lass es halt.
    Ich hoffe ich muss nie Code von dir warten.



  • hustbaer schrieb:

    Ich hoffe ich muss nie Code von dir warten.

    Na klar, der musste noch kommen. Selber keine Ahnung, aber immer feste drauf. Vollidiot.



  • 👎



  • Freund Mox, der der keine Ahnung hat, bist du.

    Aber klar. Weil ich mir bei einem sehr spezifischen Punkt nicht sicher bin, und es auch noch gewagt habe darauf hinzuweisen, hab ich keine Ahnung. 🙄 Du spinnst ja.

    ps: Und der Link bestätigt dich nicht. Du träumst halt nur und ignorierst alles was dir nicht in den Kram passt, wie z.B.

    hustbaer schrieb:

    Kommentar zur akzeptierten Antwort:

    Just a warning, that it's unspecified behaviour to use an union by writing to one member and reading from another, according to the C++ standard. So it may work, it may not.

    Bitte auch beachten dass C++ hier andere Regeln als C hat.
    Bei C ist der Umweg über ne union offiziell OK. Mit C++ ist er offiziell (=laut Standard) nicht OK. Wobei viele (alle?) C++ Compiler es trotzdem unterstützen.

    Und jetzt geh weiter träumen.



  • Wenn selbst reinterpret_cast so unsicher ist, dass es nur dazu taugt, in einen anderen Typ und wieder zurück zum ursprünglichen Typ zu casten, wofür ist das dann in der Praxis noch gut?



  • reinterpret_cast ist zu wenig zu gebrauchen. Ist jetzt aber auch keine grosse Überraschung. Bzw. sollte keine sein.

    Das Problem ist dabei aber gar nicht der reinterpret_cast selbst, sondern:

    1. Dass ein WCHAR* nen anderes (strikteres) alignment requirement haben könnte als ein WCHAR[2]
    2. Dass das Objekt ein WCHAR[2] ist, man es aber als WCHAR* liest. Was eben nicht erlaubt ist.
      reinterpret_cast hat damit nur insofern zu tun als dass er in diesem Beispiel verwendet wird um den Zeiger zu konvertieren, der dann verwendet wird um den "bösen" Zugriff zu machen.

Anmelden zum Antworten