re PR sanitizer/63802 (UBSan doesn't catch misaligned access if address is 16-bytes...
authorYury Gribov <y.gribov@samsung.com>
Tue, 18 Nov 2014 07:37:17 +0000 (07:37 +0000)
committerYury Gribov <ygribov@gcc.gnu.org>
Tue, 18 Nov 2014 07:37:17 +0000 (07:37 +0000)
2014-11-18  Yury Gribov  <y.gribov@samsung.com>

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

gcc/ChangeLog
gcc/stor-layout.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/ubsan/pr63802.c [new file with mode: 0644]

index 0befede06de06f564f7c189703a242f294e027f1..c0649cf5d03a189e7ddfff27a708b0ad44634311 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-18  Yury Gribov  <y.gribov@samsung.com>
+
+       PR sanitizer/63802
+       * stor-layout.c (min_align_of_type): Respect user alignment
+       more.
+
 2014-11-18  Ilya Enkovich  <ilya.enkovich@intel.com>
 
        * passes.c (remove_cgraph_node_from_order): New.
index 431b20715c38ebac222208cae6d466f415413aa2..db09855e1f47bc6cd09939be2d0bfcaa507f86ba 100644 (file)
@@ -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
index c97fe881252436630a3ca56f43a234055a66b9aa..8a924cc5f0e249939d65a1144270e3ecbf053945 100644 (file)
@@ -1,3 +1,8 @@
+2014-11-18  Yury Gribov  <y.gribov@samsung.com>
+
+       PR sanitizer/63802
+       * c-c++-common/ubsan/pr63802.c: New test.
+
 2014-11-18  Ilya Enkovich  <ilya.enkovich@intel.com>
 
        * 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 (file)
index 0000000..454c098
--- /dev/null
@@ -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.*" } */