diff options
author | Jakub Jelinek <jakub@redhat.com> | 2017-04-05 15:17:15 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-04-05 15:17:15 +0200 |
commit | 47a113429b00669d57bbea6aa84f51e4c4869592 (patch) | |
tree | 6423301157ac4961d6e04ab24b1d64431a50dfac | |
parent | 5f5c5e0f07c9ce7bff0498a028e9abbdf5a74183 (diff) | |
download | gcc-47a113429b00669d57bbea6aa84f51e4c4869592.zip gcc-47a113429b00669d57bbea6aa84f51e4c4869592.tar.gz gcc-47a113429b00669d57bbea6aa84f51e4c4869592.tar.bz2 |
re PR sanitizer/80308 (asan crash on big-endian powerpc-linux target)
PR sanitizer/80308
* asan.c (asan_store_shadow_bytes): Fix location of last_chunk_value
for big endian.
* c-c++-common/asan/pr80308.c: New test.
Co-Authored-By: Bernd Edlinger <bernd.edlinger@hotmail.de>
From-SVN: r246703
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/asan.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/asan/pr80308.c | 25 |
4 files changed, 41 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 873d0bc..0158a38 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-04-05 Jakub Jelinek <jakub@redhat.com> + Bernd Edlinger <bernd.edlinger@hotmail.de> + + PR sanitizer/80308 + * asan.c (asan_store_shadow_bytes): Fix location of last_chunk_value + for big endian. + 2017-04-05 Eric Botcazou <ebotcazou@adacore.com> PR target/78002 @@ -2757,10 +2757,13 @@ asan_store_shadow_bytes (gimple_stmt_iterator *iter, location_t loc, unsigned char c = (char) is_clobber ? ASAN_STACK_MAGIC_USE_AFTER_SCOPE : 0; unsigned HOST_WIDE_INT val = 0; + unsigned last_pos = size; + if (last_chunk_size && !is_clobber) + last_pos = BYTES_BIG_ENDIAN ? 0 : size - 1; for (unsigned i = 0; i < size; ++i) { unsigned char shadow_c = c; - if (i == size - 1 && last_chunk_size && !is_clobber) + if (i == last_pos) shadow_c = last_chunk_size; val |= (unsigned HOST_WIDE_INT) shadow_c << (BITS_PER_UNIT * i); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 98aa5c0..b0c764f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-04-05 Jakub Jelinek <jakub@redhat.com> + + PR sanitizer/80308 + * c-c++-common/asan/pr80308.c: New test. + 2017-04-05 Dominik Vogt <vogt@linux.vnet.ibm.com> PR target/79890 diff --git a/gcc/testsuite/c-c++-common/asan/pr80308.c b/gcc/testsuite/c-c++-common/asan/pr80308.c new file mode 100644 index 0000000..bcfa6ae --- /dev/null +++ b/gcc/testsuite/c-c++-common/asan/pr80308.c @@ -0,0 +1,25 @@ +/* PR sanitizer/80308 */ +/* { dg-do run } */ + +__attribute__((noinline, noclone)) int +foo (char *a) +{ + int i, j = 0; + asm volatile ("" : "+r" (a) : : "memory"); + for (i = 0; i < 12; i++) + j += a[i]; + return j; +} + +int +main () +{ + int i, j = 0; + for (i = 0; i < 4; i++) + { + char a[12]; + __builtin_memset (a, 0, sizeof (a)); + j += foo (a); + } + return j; +} |