Paul Eggert wrote:
> > ../lib/crc-x86_64-pclmul.c:120:26: runtime error: load of misaligned 
> > address 0x5572a8d5f161 for type 'const __m128i *', which requires 16 byte 
> > alignment
> > 0x5572a8d5f161: note: pointer points here
> >   2a 27 00  fc 75 47 2e 58 58 bf 5a  d1 0f bb b4 48 98 72 83  ab e2 e8 b8 
> > 72 44 6d 71  24 02 1a 7a d2
> >                ^
> > SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior 
> > ../lib/crc-x86_64-pclmul.c:120:26
> 
> I puzzled because the source code line is:
> 
>        memcpy (final_buf, data, bytes_remaining);
> 
> and memcpy is supposed to work on unaligned data. Is it that clang 
> assumes that, since final_buf and data are both pointers to __m128i, 
> clang can use instructions that require (instead of prefer) 16-byte 
> alignment?
Something like that, apparently.

Due to the 
"-fsanitize=address,undefined,signed-integer-overflow,shift,integer-divide-by-zero
 -fno-sanitize-recover=undefined"
options, clang emits a call to __asan_memcpy instead of memcpy.
I don't know where ASAN gets the information about the type 'const __m128i *'
from, but I'm not familiar with the ASAN internals.

Yes, the undefined behaviour really starts here, in line 35:

  const __m128i *data = buf;

'buf' was not aligned, 'const __m128i *' is 16-byte aligned.

Bruno




Reply via email to