From: Yury Gribov Date: Tue, 18 Nov 2014 07:37:17 +0000 (+0000) Subject: re PR sanitizer/63802 (UBSan doesn't catch misaligned access if address is 16-bytes... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=24ebfddf68935c1eee6e91296040edc8a0ebb5d8;p=gcc.git re PR sanitizer/63802 (UBSan doesn't catch misaligned access if address is 16-bytes (or more) aligned) 2014-11-18 Yury Gribov PR sanitizer/63802 gcc/ * stor-layout.c (min_align_of_type): Respect user alignment more. gcc/testsuite/ * c-c++-common/ubsan/pr63802.c: New test. From-SVN: r217689 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0befede06de..c0649cf5d03 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-11-18 Yury Gribov + + PR sanitizer/63802 + * stor-layout.c (min_align_of_type): Respect user alignment + more. + 2014-11-18 Ilya Enkovich * passes.c (remove_cgraph_node_from_order): New. diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 431b20715c3..db09855e1f4 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -2430,9 +2430,9 @@ unsigned int min_align_of_type (tree type) { unsigned int align = TYPE_ALIGN (type); - align = MIN (align, BIGGEST_ALIGNMENT); if (!TYPE_USER_ALIGN (type)) { + align = MIN (align, BIGGEST_ALIGNMENT); #ifdef BIGGEST_FIELD_ALIGNMENT align = MIN (align, BIGGEST_FIELD_ALIGNMENT); #endif diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c97fe881252..8a924cc5f0e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-11-18 Yury Gribov + + PR sanitizer/63802 + * c-c++-common/ubsan/pr63802.c: New test. + 2014-11-18 Ilya Enkovich * g++.dg/pr63766.C: New. diff --git a/gcc/testsuite/c-c++-common/ubsan/pr63802.c b/gcc/testsuite/c-c++-common/ubsan/pr63802.c new file mode 100644 index 00000000000..454c0980f5b --- /dev/null +++ b/gcc/testsuite/c-c++-common/ubsan/pr63802.c @@ -0,0 +1,23 @@ +/* Limit this to known non-strict alignment targets. */ +/* { dg-do run { target { i?86-*-linux* x86_64-*-linux* } } } */ +/* { dg-options "-fsanitize=alignment" } */ + +#define __round_mask(x, y) ((__typeof__(x))((y)-1)) +#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) + +struct test_struct { + unsigned long a; + int b; +} __attribute__((__aligned__(64))); + +char a[200]; + +int main () +{ + volatile int x = ((struct test_struct*)(round_up((unsigned long)a, 64) + 16))->b; + volatile int y = ((struct test_struct*)(round_up((unsigned long)a, 64) + 15))->b; + + return 0; +} + +/* { dg-output "\.c:18:\[0-9]*: \[^\n\r]*member access within misaligned address 0x\[0-9a-fA-F]* for type 'struct test_struct', which requires 64 byte alignment.*" } */