Rückgabe per Referenz = Sicherheitslücke für private Variablen?



  • Es ist nichtmal erlaubt, reservierte Wörter umzudefinieren.

    http://www.gotw.ca/gotw/076.htm




  • Mod

    knivil schrieb:

    http://www.parashift.com/c++-faq/encap-is-not-security.html

    So ist es. Hier im Thread wird auch viel zu kompliziert gedacht. Man benötigt gar keinen Zugriff auf den Code der Klasse, die Sprache bietet sogar native Mittel an, die privaten Variablen zu ändern:

    class Foo
    {
    private:
      int i = 10;
    public:
      void speak_your_mind() const { std::cout << i << '\n'; }
    };
    
    int main()
    {
      Foo f;
      f.speak_your_mind();
      *reinterpret_cast<int*>(&f) = 5;
      f.speak_your_mind();
    }
    


  • die Sprache bietet sogar native Mittel an, die privaten Variablen zu ändern:

    Genau daran habe ich auch gedacht - das ginge sogar noch besser mit [c]offsetof[/c]. Aber das ist natürlich undefiniertes Verhalten.

    Der Punkt ist natürlich, dass der Programmierer gut gesinnt sein muss. Es gibt zahllose Möglichkeiten, den Code zu missbrauchen, keine Frage. Aber wenn eine Variable private ist, dann hat das einen Grund: Sie existiert für den Benutzer der Klasse praktisch gar nicht.

    C++ ist schon eine interessante Mischung aus Abstraktion und so einem low-level Gefummel.

    @µ: Mal wieder ein sehr schöner GotW-Artikel. Mann, ich muss sie alle durchlesen.



  • offsetof funktioniert natürlich nicht, wenn der Member privat ist. Deshalb ist diese (SeppJs) Methode außer in seltenen Fällen nicht praktikabel und portabel, da man nur auf die erste deklarierte Variable so zugreifen kann und auch nur dann, wenn das Layout der Klasse nicht durch virtuelle Funktionen, Basisklassen, Referenzen, Datenmember verschiedener Sichtbarkeitslevel etc. durcheinandergebracht wird.



  • Bashar schrieb:

    offsetof funktioniert natürlich nicht, wenn der Member privat ist.

    Bashar, das habe ich gerade bemerkt. Vor einer Sekunde editiert und da sehe ich deinen Post. 🙂



  • Aber das ist natürlich undefiniertes Verhalten.

    Darum geht es nicht. Ausserdem ist UB auch ein Weg, Sprachdefinitionen einfacher zu gestalten.

    portabel

    Das ist beim Einsatz solcher Mittel wohl selten das Ziel.

    wenn das Layout der Klasse nicht durch virtuelle Funktionen, Basisklassen, Referenzen, Datenmember verschiedener Sichtbarkeitslevel etc. durcheinandergebracht wird

    Das macht die Sache nur schwieriger. Mehr nicht.

    Sie existiert für den Benutzer der Klasse praktisch gar nicht.

    Doch tun sie, auch praktisch.

    C++ ist schon eine interessante Mischung aus Abstraktion und so einem low-level Gefummel.

    Blafasel. Ich kann auch inline C oder inline Asm benutzen. Ersteres ist sogar geschenkt.



  • Doch tun sie, auch praktisch.

    Wie? Wie existieren sie für ihn?

    Durch spezielle Tricks kannst du auf den Namen zugreifen. Ausnahme.
    Oder die Klasse ist ein paar Bytes größer.

    Blafasel. Ich kann auch inline C oder inline Asm benutzen. Ersteres ist sogar geschenkt.

    Wovon redest du? Ich meinte, dass man so etwas wie Klassen mit so etwas wie reinterpret_cast in Verbindung bringt. Weiß nicht, worauf du gerade hinauswillst.


Anmelden zum Antworten