Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pointer from integer without a cast, dangereux ?

    18 juillet 2018 à 9:49:40

    ox223252 a écrit:

    	uint16_t b;
    
    	b = 0xaabb;
    
    	*(uint8_t*)&b = 0x10;
    
    

    [...]  tu ne vas toucher que le nombre de bits spécifiés, donc si tu affecte une valeur à la partie basse tu ne changes que la partie basse.

    [...] ça peut vite être ... dangereux et le bordel aussi

    C'est déjà le bordel, à cause de l' "endianness", le fait que quand on code une quantité de 16 bits sur 2 octets, le premier octet est soit la partie haute (les 8 bits de poids fort), soit  la partie basse.

    Ici, si ça touche la partie basse, c'est que tu es sur une machine d'architecture "little-endian" comme le x86.L'adresse de la donnée sur 16 bits est l'adresse de l'octet de partie basse, puisqu'il vient avant l'autre.

    Ca toucherait la partie haute sur d'autres machines (Sparc, Motorola 68k,...). Autrement dit, le code n'est pas portable, si _l'intention_ était de toucher la partie basse. Donc c'est le bordel.

    https://fr.wikipedia.org/wiki/Endianness

    -
    Edité par michelbillaud 18 juillet 2018 à 9:53:35

    • Partager sur Facebook
    • Partager sur Twitter
      18 juillet 2018 à 11:56:29

      michelbillaud a écrit:

      Ici, si ça touche la partie basse, c'est que tu es sur une machine d'architecture "little-endian" comme le x86.L'adresse de la donnée sur 16 bits est l'adresse de l'octet de partie basse, puisqu'il vient avant l'autre.

      Ca toucherait la partie haute sur d'autres machines (Sparc, Motorola 68k,...). Autrement dit, le code n'est pas portable, si _l'intention_ était de toucher la partie basse. Donc c'est le bordel.

      https://fr.wikipedia.org/wiki/Endianness

      -
      Edité par michelbillaud il y a environ 1 heure


      Effectivement il faut pas oublier little et big endian, donc l'embarqué c'est ... enfin bref on devient vite chauve ^^
      • Partager sur Facebook
      • Partager sur Twitter

      la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

      Mon GitHub

        18 juillet 2018 à 15:01:19

        ox223252 a écrit:

        michelbillaud a écrit:

        Ici, si ça touche la partie basse, c'est que tu es sur une machine d'architecture "little-endian" comme le x86.L'adresse de la donnée sur 16 bits est l'adresse de l'octet de partie basse, puisqu'il vient avant l'autre.

        Ca toucherait la partie haute sur d'autres machines (Sparc, Motorola 68k,...). Autrement dit, le code n'est pas portable, si _l'intention_ était de toucher la partie basse. Donc c'est le bordel.

        https://fr.wikipedia.org/wiki/Endianness

        -
        Edité par michelbillaud il y a environ 1 heure


        Effectivement il faut pas oublier little et big endian, donc l'embarqué c'est ... enfin bref on devient vite chauve ^^


        Pas forcément. Si on veut remplacer la partie basse d'un entier 16 bits, indépendamment de l'architecture, on s'y prend autrement :

        b = (b & 0xFF00) | 0x10;   // look ma, no typecast!
        



        • Partager sur Facebook
        • Partager sur Twitter
          18 juillet 2018 à 18:46:25

          Le cast d'un type vers un type plus petit perd toujours le poids fort quel que soit l'endianness.
          Le cast d'une donnée pointée en une donnée plus petite perd le poids fort en little endian, mais perd le poids faible en big endian.

          Pour les nombres négatifs c'est encore plus subtil.

          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

          Pointer from integer without a cast, dangereux ?

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown