[Bug sanitizer/80308] asan crash on big-endian powerpc-linux target
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Apr 4 19:37:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80308
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2017-04-04
Ever confirmed|0 |1
--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to Bernd Edlinger from comment #6)
> this looks suspicious:
>
> --- asan.c.jj 2017-03-27 10:25:01.000000000 +0200
> +++ asan.c 2017-04-04 21:15:31.444941816 +0200
> @@ -2762,7 +2762,8 @@ asan_store_shadow_bytes (gimple_stmt_ite
> unsigned char shadow_c = c;
> if (i == size - 1 && last_chunk_size && !is_clobber)
> shadow_c = last_chunk_size;
> - val |= (unsigned HOST_WIDE_INT) shadow_c << (BITS_PER_UNIT * i);
> + val |= (unsigned HOST_WIDE_INT) shadow_c
> + << (BITS_PER_UNIT * (BYTES_BIG_ENDIAN ? size - 1 - i : i));
> }
>
> /* Handle last chunk in unpoisoning. */
Indeed, though perhaps it might be more readable to:
for (unsigned i = 0; i < size; ++i)
{
unsigned char shadow_c = c;
if (i == (BYTES_BIG_ENDIAN ? 0 : size - 1)
&& last_chunk_size
&& !is_clobber)
shadow_c = last_chunk_size;
val |= (unsigned HOST_WIDE_INT) shadow_c << (BITS_PER_UNIT * i);
}
But we really want a testcase for the testsuite here.
It needs to be something simple that with (the default
-fsanitize-use-after-scope) unpoisons and later poisons a variable with size
that is not a multiple of 32 bytes, such as that size of 12.
More information about the Gcc-bugs
mailing list