Konvertierung von 'size_t' nach 'int', Datenverlust möglich (Split aus: Extremnekromantie)


  • Mod

    Jockelx schrieb:

    SeppJ schrieb:

    size_t darf genausogut auch kleiner als int sein.

    Äh, okay...also sind alle vorherigen Aussagen noch 'falscher' als meine!?

    Ich sehe zwei Hauptaussagen:
    1. sizeof(size_t) und sizeof(int) haben absolut nichts miteinander zu tun. Offensichtlich ist diese Aussage objektiv richtig, denn hier ist sizeof(int) < sizeof(size_t) und es gibt unzählige weitere Beispiele (eigentlich alles außer den üblichen 32 Bit Systemen der späten 90er und frühen 2000er) bei denen sizeof(size_t) != sizeof(int). Und natürlich auch viele Beispiele bei denen sizeof(size_t) == sizeof(int) (nämlich eben die erwähnten 32 Bit Systeme), denn dass sie nichts miteinander zu tun haben, schließt nicht aus, dass sie gleich sein dürfen.
    2. Es ist wichtig, solche Feinheiten im Sprachstandard ernst zu nehmen. Ob diese Aussage richtig oder falsch ist, ist eher subjektiv. Wegen genau diesem Problem ist wahrscheinlich noch niemand gestorben, aber wegen verwandter Fehler sind durchaus schon reale Werte in großem Stil vernichtet worden. Wenn dir Overflows nicht passen, weil du sie eher als echten Programmierfehler ansiehst, dann nimm stattdessen Beispiele, bei denen z.B. der Linuxkernel ein Sicherheitsloch hatte, weil der Compiler ein undefiniertes Codestück wegoptimiert hatte (was er darf, da undefiniert).



  • SeppJ schrieb:

    size_t darf genausogut auch kleiner als int sein. Wichtig ist jedenfalls, dass der Compiler hier nicht grundlos warnt und man dies schon ernst nehmen sollte.

    Aktuelles Beispiel, das nicht aus grauer Vorzeit stammt: Arduino (Nano zumindest): sizeof(size_t) = 2 und sizeof(int) = 4
    Es ist schon richtig, dass man für portablen Code keine wie auch immer geartete Relation zwischen beiden annehmen sollte.


Anmelden zum Antworten