re PR sanitizer/58443 (ubsan doesn't properly honor fsanitize= flags)
authorMarek Polacek <polacek@redhat.com>
Wed, 18 Sep 2013 13:31:34 +0000 (13:31 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Wed, 18 Sep 2013 13:31:34 +0000 (13:31 +0000)
2013-09-18  Marek Polacek  <polacek@redhat.com>

PR sanitize/58443
cp/
* typeck.c (cp_build_binary_op): Properly honor -fsanitize options.
Remove unnecessary check.

c/
* c-typeck.c (build_binary_op): Properly honor -fsanitize options.
Remove unnecessary check.

testsuite/
* g++.dg/ubsan/div-by-zero-1.C: Use the integer-divide-by-zero option
instead of the shift option.
* c-c++-common/ubsan/pr58443-1.c: New test.
* c-c++-common/ubsan/pr58443-3.c: New test.
* c-c++-common/ubsan/pr58443-2.c: New test.

From-SVN: r202701

gcc/c/ChangeLog
gcc/c/c-typeck.c
gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/ubsan/pr58443-1.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/ubsan/pr58443-2.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/ubsan/pr58443-3.c [new file with mode: 0644]
gcc/testsuite/g++.dg/ubsan/div-by-zero-1.C

index 59b71aa0e9d7dbab8272ac693849f787c95b6c9e..81b2018e8c04881296f063b2d02365e5cbc4964e 100644 (file)
@@ -1,3 +1,9 @@
+2013-09-18  Marek Polacek  <polacek@redhat.com>
+
+       PR sanitize/58443
+       * c-typeck.c (build_binary_op): Properly honor -fsanitize options.
+       Remove unnecessary check.
+
 2013-09-18  Marek Polacek  <polacek@redhat.com>
 
        PR sanitizer/58411
index 7dc5527fc7c63d6fe81e3bb356841f946cf4f98c..7ecafe4894c20452c842d5f1c5b56bdbd7410bc3 100644 (file)
@@ -10496,7 +10496,7 @@ build_binary_op (location_t location, enum tree_code code,
        return error_mark_node;
     }
 
-  if (flag_sanitize & SANITIZE_UNDEFINED
+  if ((flag_sanitize & (SANITIZE_SHIFT | SANITIZE_DIVIDE))
       && current_function_decl != 0
       && !lookup_attribute ("no_sanitize_undefined",
                            DECL_ATTRIBUTES (current_function_decl))
@@ -10507,9 +10507,9 @@ build_binary_op (location_t location, enum tree_code code,
       op1 = c_save_expr (op1);
       op0 = c_fully_fold (op0, false, NULL);
       op1 = c_fully_fold (op1, false, NULL);
-      if (doing_div_or_mod)
+      if (doing_div_or_mod && (flag_sanitize & SANITIZE_DIVIDE))
        instrument_expr = ubsan_instrument_division (location, op0, op1);
-      else if (doing_shift)
+      else if (doing_shift && (flag_sanitize & SANITIZE_SHIFT))
        instrument_expr = ubsan_instrument_shift (location, code, op0, op1);
     }
 
@@ -10537,7 +10537,7 @@ build_binary_op (location_t location, enum tree_code code,
     ret = build1 (EXCESS_PRECISION_EXPR, semantic_result_type, ret);
   protected_set_expr_location (ret, location);
 
-  if ((flag_sanitize & SANITIZE_UNDEFINED) && instrument_expr != NULL)
+  if (instrument_expr != NULL)
     ret = fold_build2 (COMPOUND_EXPR, TREE_TYPE (ret),
                       instrument_expr, ret);
 
index c16d682459da2ac7aeddf2794ce2591322dbde9a..d53fb51198b74409c1b6c3a0ee1e59cbb6a31614 100644 (file)
@@ -1,3 +1,9 @@
+2013-09-18  Marek Polacek  <polacek@redhat.com>
+
+       PR sanitize/58443
+       * typeck.c (cp_build_binary_op): Properly honor -fsanitize options.
+       Remove unnecessary check.
+
 2013-09-18  Marek Polacek  <polacek@redhat.com>
 
        PR sanitizer/58411
index f7d6208022fd73416d2775b27f05ec3426df60c2..bcb87825a1e2f329238e100604052ff7dc1d4135 100644 (file)
@@ -4884,7 +4884,7 @@ cp_build_binary_op (location_t location,
   if (build_type == NULL_TREE)
     build_type = result_type;
 
-  if ((flag_sanitize & SANITIZE_UNDEFINED)
+  if ((flag_sanitize & (SANITIZE_SHIFT | SANITIZE_DIVIDE))
       && !processing_template_decl
       && current_function_decl != 0
       && !lookup_attribute ("no_sanitize_undefined",
@@ -4898,7 +4898,7 @@ cp_build_binary_op (location_t location,
                                                                  tf_none));
       op1 = maybe_constant_value (fold_non_dependent_expr_sfinae (op1,
                                                                  tf_none));
-      if (doing_div_or_mod)
+      if (doing_div_or_mod && (flag_sanitize & SANITIZE_DIVIDE))
        {
          /* For diagnostics we want to use the promoted types without
             shorten_binary_op.  So convert the arguments to the
@@ -4912,7 +4912,7 @@ cp_build_binary_op (location_t location,
            }
          instrument_expr = ubsan_instrument_division (location, cop0, cop1);
        }
-      else if (doing_shift)
+      else if (doing_shift && (flag_sanitize & SANITIZE_SHIFT))
        instrument_expr = ubsan_instrument_shift (location, code, op0, op1);
     }
 
@@ -4926,7 +4926,7 @@ cp_build_binary_op (location_t location,
       && !TREE_OVERFLOW_P (op1))
     overflow_warning (location, result);
 
-  if ((flag_sanitize & SANITIZE_UNDEFINED) && instrument_expr != NULL)
+  if (instrument_expr != NULL)
     result = fold_build2 (COMPOUND_EXPR, TREE_TYPE (result),
                          instrument_expr, result);
 
index 7a243c3c7b5c9f9b42c99af97809496c1152eb93..8fc51745109a2b52cc4c55e0766d10d5b98bdbdc 100644 (file)
@@ -1,3 +1,12 @@
+2013-09-18  Marek Polacek  <polacek@redhat.com>
+
+       PR sanitize/58443
+       * g++.dg/ubsan/div-by-zero-1.C: Use the integer-divide-by-zero option
+       instead of the shift option.
+       * c-c++-common/ubsan/pr58443-1.c: New test.
+       * c-c++-common/ubsan/pr58443-3.c: New test.
+       * c-c++-common/ubsan/pr58443-2.c: New test.
+
 2013-09-18  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/58417
diff --git a/gcc/testsuite/c-c++-common/ubsan/pr58443-1.c b/gcc/testsuite/c-c++-common/ubsan/pr58443-1.c
new file mode 100644 (file)
index 0000000..76f1dda
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR sanitizer/58443 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=shift,unreachable -w" } */
+
+int
+foo (int u, int o)
+{
+  return u / o;
+}
+
+/* { dg-final { scan-assembler-not "__ubsan_handle_divrem_overflow" } } */
diff --git a/gcc/testsuite/c-c++-common/ubsan/pr58443-2.c b/gcc/testsuite/c-c++-common/ubsan/pr58443-2.c
new file mode 100644 (file)
index 0000000..a135758
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR sanitizer/58443 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=unreachable,integer-divide-by-zero -w" } */
+
+int
+foo (int u, int o)
+{
+  return u >> o;
+}
+
+/* { dg-final { scan-assembler-not "__ubsan_handle_shift_out_of_bounds" } } */
diff --git a/gcc/testsuite/c-c++-common/ubsan/pr58443-3.c b/gcc/testsuite/c-c++-common/ubsan/pr58443-3.c
new file mode 100644 (file)
index 0000000..5696a62
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR sanitizer/58443 */
+/* { dg-do compile } */
+/* { dg-options "-fsanitize=undefined -w" } */
+
+int
+foo (int u, int o)
+{
+  return u >> o;
+}
+
+int
+bar (int u, int o)
+{
+  return u / o;
+}
+
+/* { dg-final { scan-assembler "__ubsan_handle_divrem_overflow" } } */
+/* { dg-final { scan-assembler "__ubsan_handle_shift_out_of_bounds" } } */
index d7d2c8f1565d571a4bf43c98cd83cfdc939f4319..88acfa1517eb045a81bf472ccfd93ddbc176fffc 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-fsanitize=shift -w" } */
+/* { dg-options "-fsanitize=integer-divide-by-zero -w" } */
 
 void
 foo (int i)