È un carico disallineato a causa di un cast dal comportamento non definito void*
?È un carico disallineato a causa di un comportamento non definito del cast?
Ecco quello che sto vedendo con Clang e le sue disinfettanti:
bufhelp.h:146:29: runtime error: load of misaligned address 0x7fff04fdd0e1 for type 'const uintptr_t' (aka 'const unsigned long'), which requires 8 byte alignment
0x7fff04fdd0e1: note: pointer points here
00 00 00 66 66 6f 6f 62 61 72 34 32 46 4f 4f 42 41 52 31 37 66 6f 6f 62 61 72 34 33 46 4f 4f 42
^
Ed è qui che il cast entra in gioco:
buf_xor(void *_dst, const void *_src1, const void *_src2, size_t len)
{
...
ldst = (uintptr_t *)(void *)dst;
lsrc1 = (const uintptr_t *)(const void *)src1;
lsrc2 = (const uintptr_t *)(const void *)src2;
for (; len >= sizeof(uintptr_t); len -= sizeof(uintptr_t))
*ldst++ = *lsrc1++^*lsrc2++;
...
}
correlati, ma io don' Credo che risponda alla domanda di cui sopra:
- What is a misaligned pointer?
- Type punning and Unions in C
- Type punning with void * without breaking the strict aliasing rule in C99
Dipenderà interamente da ciò che viene mostrato in quella funzione come parametri. Senza vedere il codice chiamante, non è davvero possibile rispondere alla domanda. – Lundin
@Lundin: è questo il caso? Clang ha già avvisato che l'indirizzo è 0x7fff04fdd0e1. Può '0xXXXXXXX1' essere mai un' uintptr_t * 'usato nel ciclo? O sto analizzando l'output di Clang in modo errato? – jww
Sì, ma _why_ è XXX1? È necessario passare un puntatore char o qualcosa alla funzione. Non c'è nulla nel codice pubblicato che possa causare un disallineamento, poiché tutta l'aritmetica del puntatore che si esegue è basata sul tipo corretto. – Lundin