Forum Clubic

[C] Problème avec le strict aliasing

Salut à tous,

Voilà, j’ai un petit problème avec GCC, et plus globalement le standard C99. J’ai un appel de fonction qui ressemble à ceci :

FuError ret = fu_memory_resize ((void **) &ht->array, size * sizeof (FuHashNode *));

C’est un simple appel à realloc déguisé, en fait. La fonction retourne si oui ou non il y a eu erreur, et si non, elle place l’adresse dans le pointeur pointé par le premier argument.

Le code fonctionne parfaitement, le problème survient quand j’active le flag -O2. En fait, j’ai un avertissement tout con :

Le problème c’est que l’aliasing n’est pas correct selon le standard C99… Mais je ne vois pas comment faire autrement. Le coup de l’union (etc) pour ce genre de problème ne s’applique pas ici. La fonction ne fait que modifier un pointeur, qui peut être de n’importe quel type.

Je peux bien évidemment passer à GCC le flag -fno-strict-aliasing mais ça me plait moyennement… J’aimerais si possible modifier le code de façon à faire disparaitre l’avertissement de GCC.

Alors, voilà, je bloque donc si vous avez une solution, je suis preneur… Si non tant pis mais bon… Enfin voilà :stuck_out_tongue:

J’ai checké via google et apparamment, cela n’a rien de grave, c’est dû au (void**) qui force le casting de ton pointeur vers un autre donc la meilleure solution est bien l’union. (cf ici )

Yep, c’est bien ce que je pensais… Mais l’union n’est pas trop envisageable, cette fonction est un bête realloc en fait. Elle prend un void ** donc avec ça, je pensais pouvoir lui passer ni’mporte quoi qui finisse par ** (en gros).

Hors non seulement je suis obligé de caster l’argument, mais en plus il en veut pas comme ça :smiley: Je sais que ça n’a rien de grave, mais bon… perfectionnisme quand tu nous tiens :ange: