union mit bitfield-struct und long int - undefined behavior



  • ich räume hier gerade 15 Jahre alten C/C++ Code auf und bin auf folgendes gestossen (versuche so vorsichtig wie möglich alten Visual C++ 97/98 Code auf Standardkonform und mit normalen C/C++ Kompiler baubar zu machen)

    union test 
    {
      struct 
      {
        unsigned a1: 16;
        unsigned a2: 12;
        unsigned a3: 3;
        unsigned a4: 1;
      };
      struct {
        unsigned b1: 24;
        unsigned b2: 7;
        unsigned b3: 1;
      };
      long int as_long_int;
    };
    
    int main()
    {
      //Nutzungbeispiel
      test t;
      t.as_long_int = 20;
      unsigned x = t.a1;
      unsigned y = t.b1;
      t.b1 = 20;
      long int z = t.as_long_int;
      return x+y+z;
    }
    

    ist das bezüglich Undefined Behavior irgendwie böse - oder alles in Ordnung?


  • Mod

    Theoretisch ziemlich böse, sowohl wechselhafter Zugriff auf Unions, als auch Ausnutzen der internen Darstellung von Bitfeldern und Integern. Praktisch gesehen wird es relativ verlässlich funktionieren, wenn man immer nur für gleichartige Systeme compiliert, am besten sogar immer den gleichen Compiler nutzt. Deswegen wird das auch noch niemandem in all den Jahren um die Ohren geflogen sein. Ändere es aber trotzdem. Sind bloß ein paar Bitschiebeoperationen, wenn man es standardkonform machen möchte.



  • Sind bloß ein paar Bitschiebeoperationen, wenn man es standardkonform machen möchte.

    du würdest also ein long int als einzigen Member nutzen mit set/get-Funktionen fuer a1,a2,... usw.


  • Mod

    Gast3 schrieb:

    du würdest also ein long int als einzigen Member nutzen mit set/get-Funktionen fuer a1,a2,... usw.

    Nein, eigentlich nicht, aber mag sein, dass mir nicht ganz klar ist, worum es hier geht. Nach deinem reduzierten Beispiel sah es so aus, als ginge es darum, bestimmte Bits einer Zahl abzufragen bzw. zu setzen.



  • Nein, eigentlich nicht, aber mag sein, dass mir nicht ganz klar ist, worum es hier geht. Nach deinem reduzierten Beispiel sah es so aus, als ginge es darum, bestimmte Bits einer Zahl abzufragen bzw. zu setzen.

    ja schon - nur eben in ein paar tausend Zeilen Code - deswegen die Funktionen - und der Member weil der long int durch die Schnittstellen gereicht wird


Anmelden zum Antworten