J'ai du code C qui traite les paniers/unpadded données binaires qui vient par le réseau.
Ce code a été/est fonctionne bien sous Intel/x86, mais quand j'ai compilé sous le BRAS, il serait souvent se bloquer.
Le coupable, comme vous l'avez deviné, était non alignés pointeurs-en particulier, l'analyse de code douteux des choses comme ceci:
uint8_t buf[2048];
[... code to read some data into buf...]
int32_t nextWord = *((int32_t *) &buf[5]); // misaligned access -- can crash under ARM!
... c'est de toute évidence ne va pas à voler dans les BRAS de la terre, alors je l'ai modifié pour ressembler à ceci:
uint8_t buf[2048];
[... code to read some data into buf...]
int32_t * pNextWord = (int32_t *) &buf[5];
int32 nextWord;
memcpy(&nextWord, pNextWord, sizeof(nextWord)); // slower but ARM-safe
Ma question (à partir d'une langue-avocat point de vue), c'est que mon "BRAS-fixe" approche bien définie en vertu de la C les règles de la langue?
Mon souci, c'est que peut-être même juste en ayant un mal alignées-int32_t-pointeur peut être suffisant pour invoquer un comportement indéfini, même si je n'ai jamais fait de déréférencement directement. (Si ma préoccupation est valide, je pense que je pourrais résoudre le problème en changeant pNextWord
's type d' (const int32_t *)
de (const char *)
, mais je préfère ne pas le faire sauf si c'est réellement nécessaire de le faire, puisqu'il faudrait faire quelques pointeur de la foulée de l'arithmétique à la main)