We're getting SIGFPE, because one simply does not divide by zero.
Fixed by doing the modulo only when size != 0.

Regtested/bootstrapped on x86_64-linux, ok for trunk and 4.8?

2013-04-22  Marek Polacek  <pola...@redhat.com>

        PR sanitizer/56990
        * tsan.c (instrument_expr): Don't count modulo if the size
        is zero.

        * gcc.dg/pr56990.c: New test.

--- gcc/tsan.c.mp       2013-04-19 15:39:46.416450528 +0200
+++ gcc/tsan.c  2013-04-22 17:23:54.115647673 +0200
@@ -131,7 +131,8 @@ instrument_expr (gimple_stmt_iterator gs
   if (TREE_READONLY (base))
     return false;
 
-  if (bitpos % (size * BITS_PER_UNIT)
+  if ((size != 0
+       && bitpos % (size * BITS_PER_UNIT))
       || bitsize != size * BITS_PER_UNIT)
     return false;
 
--- gcc/testsuite/gcc.dg/pr56990.c.mp   2013-04-22 17:30:14.523876683 +0200
+++ gcc/testsuite/gcc.dg/pr56990.c      2013-04-22 17:29:06.704666252 +0200
@@ -0,0 +1,10 @@
+/* PR sanitizer/56990 */
+/* { dg-do compile { target { x86_64-*-linux* && lp64 } } } */
+/* { dg-options "-fsanitize=thread" } */
+
+struct S{};
+
+void foo(struct S *p)
+{
+  *p = (struct S){};
+}

        Marek

Reply via email to