From patchwork Mon Apr 22 16:11:26 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Fix PR56990 X-Patchwork-Submitter: Marek Polacek X-Patchwork-Id: 238607 Message-Id: <20130422161126.GH13346@redhat.com> To: GCC Patches Date: Mon, 22 Apr 2013 18:11:26 +0200 From: Marek Polacek List-Id: 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 PR sanitizer/56990 * tsan.c (instrument_expr): Don't count modulo if the size is zero. * gcc.dg/pr56990.c: New test. Marek --- 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){}; +}