Un aliasing strict me rend paranoïaque. Il y a des moments où je place des valeurs avec un pointeur de * int et m'attends à ce que la mémoire ciblée lise les mêmes données quel que soit le type de pointeur de lecture. L'aliasing strict ne le garantit pas et parfois même ne le fait pas. Si je lis un char [] dans une boucle et qu'il y a un int intériorisant quelque chose dans ce tableau char [], je brise les règles d'alias parmi d'autres choses C standard.memcpy alias int à char donne UB?
Je fais un compilateur JIT et puisque j'utilise x86 je suis sûr que je n'ai pas à m'inquiéter d'int-alignement. Gardons cela hors de l'équation jusqu'à ce que nous ayons résolu le problème d'aliasing.
Considérez cet extrait:
unsigned char x86[] = {0x11, 0x44, 0x42, ... };
uint32_t *specific_imm = (x86+10);
Maintenant, * specific_imm = 42; sur une plate-forme x86 est toujours UB parce que le compilateur est autorisé à supposer que * specific_imm n'est pas aliasing avec x86 []. En faisant cette supposition, il n'a pas besoin de définir ces octets tout de suite mais peut faire toutes sortes d'optimisations. Mettre x86 [] et * specific_imm à la fois comme volatile résoudrait mon problème mais ce n'est pas assez bon puisque je veux apprendre C correctement.
Nous avons résolu le problème d'aliasing maintenant. Certains suggèrent cette solution: memcpy (x86 + 10, specific_imm, 4);
Mais la norme C semble avoir un problème avec cela aussi concernant les pointeurs d'alias (si j'ai bien compris les choses) comme illustré par le code suivant.
/* naive implementation of memcpy */
inline void _memcpy(unsigned char *a, unsigned char *b){
*a = *b;
}
int main(void) {
long i = 0xFFFFFFFF;
unsigned char c = 1;
++i;
_memcpy(&c,&i);
return c;
}
Depuis le compilateur est libre de supposer que « i » ne touche pas les Ic en quelque sorte dans ce cas (?), Le principal est libre d'être optimisé pour revenir à seulement 1?
Je suis plus intéressé à résoudre le problème avant de passer directement aux solutions.
Merci d'avance
Je vous suggère de vous corriger par exemple, vous avez probablement vu mes commentaires dans la réponse: La valeur de i n'est pas évidente. – 2501