From a54300190578a207d66e7db8931eabe936261c14 Mon Sep 17 00:00:00 2001 From: Marek Polacek Date: Fri, 20 Sep 2013 13:26:07 +0000 Subject: [PATCH] re PR sanitizer/58413 (ubsan constant folding) 2013-09-20 Marek Polacek PR sanitizer/58413 * ubsan.c (get_ubsan_type_info_for_type): Use TYPE_SIZE instead of TYPE_PRECISION. Add asserts. testsuite/ * c-c++-common/ubsan/shift-4.c: New test. From-SVN: r202776 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/c-c++-common/ubsan/shift-4.c | 14 ++++++++++++++ gcc/ubsan.c | 7 +++---- 4 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/ubsan/shift-4.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e4e4a69a871..2e50e731b62 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-09-20 Marek Polacek + + PR sanitizer/58413 + * ubsan.c (get_ubsan_type_info_for_type): Use TYPE_SIZE instead of + TYPE_PRECISION. Add asserts. + 2013-09-20 Richard Biener PR tree-optimization/58453 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8d287f1665c..f34163210b5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-09-20 Marek Polacek + + PR sanitizer/58413 + * c-c++-common/ubsan/shift-4.c: New test. + 2013-09-20 Richard Biener PR tree-optimization/58453 diff --git a/gcc/testsuite/c-c++-common/ubsan/shift-4.c b/gcc/testsuite/c-c++-common/ubsan/shift-4.c new file mode 100644 index 00000000000..239c0131fb9 --- /dev/null +++ b/gcc/testsuite/c-c++-common/ubsan/shift-4.c @@ -0,0 +1,14 @@ +/* { dg-do run } */ +/* { dg-options "-fsanitize=shift -w" } */ + +struct S { unsigned long long int b:40; } s; + +int +main () +{ + s.b = 2; + s.b <<= 120; + return 0; +} + +/* { dg-output "shift exponent 120 is too large\[^\n\r]*(\n|\r\n|\r)" } */ diff --git a/gcc/ubsan.c b/gcc/ubsan.c index b8d40d52128..6c6fea80afd 100644 --- a/gcc/ubsan.c +++ b/gcc/ubsan.c @@ -233,10 +233,9 @@ ubsan_source_location (location_t loc) static unsigned short get_ubsan_type_info_for_type (tree type) { - int prec = exact_log2 (TYPE_PRECISION (type)); - if (prec == -1) - error ("unexpected size of type %qT", type); - + gcc_assert (TYPE_SIZE (type) && host_integerp (TYPE_SIZE (type), 1)); + int prec = exact_log2 (tree_low_cst (TYPE_SIZE (type), 1)); + gcc_assert (prec != -1); return (prec << 1) | !TYPE_UNSIGNED (type); } -- 2.30.2