re PR sanitizer/83392 (FAIL: c-c++-common/ubsan/ptr-overflow-sanitization-1.c scan...
authorJakub Jelinek <jakub@redhat.com>
Wed, 14 Mar 2018 08:50:23 +0000 (09:50 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 14 Mar 2018 08:50:23 +0000 (09:50 +0100)
PR sanitizer/83392
* sanopt.c (maybe_optimize_ubsan_ptr_ifn): Handle also
INTEGER_CST offset, add it together with bitpos / 8 and
sign extend based on POINTER_SIZE.

* c-c++-common/ubsan/ptr-overflow-sanitization-1.c: Adjust expected
check count from 17 to 14.

From-SVN: r258516

gcc/ChangeLog
gcc/sanopt.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/ubsan/ptr-overflow-sanitization-1.c

index 3e174c58cbf21e296ec4719477411f2a3edbe19d..0bfc201813054c4c62e4f4860b6cdd0663b05955 100644 (file)
@@ -1,5 +1,10 @@
 2018-03-14  Jakub Jelinek  <jakub@redhat.com>
 
+       PR sanitizer/83392
+       * sanopt.c (maybe_optimize_ubsan_ptr_ifn): Handle also
+       INTEGER_CST offset, add it together with bitpos / 8 and
+       sign extend based on POINTER_SIZE.
+
        PR target/84844
        Revert
        2017-04-20  Uros Bizjak  <ubizjak@gmail.com>
index 43743130a35a76ca47f36ef4f8494cab807b4bd2..116bc380f826d9dfa1c39df9cb0fa5c013784691 100644 (file)
@@ -486,12 +486,17 @@ maybe_optimize_ubsan_ptr_ifn (sanopt_ctx *ctx, gimple *stmt)
       HOST_WIDE_INT bitpos;
       base = get_inner_reference (base, &bitsize, &pbitpos, &offset, &mode,
                                  &unsignedp, &reversep, &volatilep);
-      if (offset == NULL_TREE
+      if ((offset == NULL_TREE || TREE_CODE (offset) == INTEGER_CST)
          && DECL_P (base)
          && pbitpos.is_constant (&bitpos))
        {
          gcc_assert (!DECL_REGISTER (base));
-         offset_int expr_offset = bitpos / BITS_PER_UNIT;
+         offset_int expr_offset;
+         if (offset)
+           expr_offset = wi::to_offset (offset) + bitpos / BITS_PER_UNIT;
+         else
+           expr_offset = bitpos / BITS_PER_UNIT;
+         expr_offset = wi::sext (expr_offset, POINTER_SIZE);
          offset_int total_offset = expr_offset + cur_offset;
          if (total_offset != wi::sext (total_offset, POINTER_SIZE))
            {
@@ -511,7 +516,7 @@ maybe_optimize_ubsan_ptr_ifn (sanopt_ctx *ctx, gimple *stmt)
              && (!is_global_var (base) || decl_binds_to_current_def_p (base)))
            {
              offset_int base_size = wi::to_offset (DECL_SIZE_UNIT (base));
-             if (bitpos >= 0
+             if (!wi::neg_p (expr_offset)
                  && wi::les_p (total_offset, base_size))
                {
                  if (!wi::neg_p (total_offset)
@@ -532,7 +537,7 @@ maybe_optimize_ubsan_ptr_ifn (sanopt_ctx *ctx, gimple *stmt)
             */
 
          bool sign_cur_offset = !wi::neg_p (cur_offset);
-         bool sign_expr_offset = bitpos >= 0;
+         bool sign_expr_offset = !wi::neg_p (expr_offset);
 
          tree base_addr
            = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (base)), base);
index 215e30220541b6ab76c17b65eaf080f7bd5934ec..a86d8ccf14b36dc99c8baca75ff3f9671d85154d 100644 (file)
@@ -1,5 +1,9 @@
 2018-03-14  Jakub Jelinek  <jakub@redhat.com>
 
+       PR sanitizer/83392
+       * c-c++-common/ubsan/ptr-overflow-sanitization-1.c: Adjust expected
+       check count from 17 to 14.
+
        PR target/84844
        * gcc.target/i386/pr84844.c: New test.
 
index c12c7df252b9b9ca01c998cfa121abf4f7467368..14569d5a5c6106101a45fddb362b64da1b167b21 100644 (file)
@@ -25,9 +25,9 @@ void foo(void)
   p2 = p + 2;
 
   p = b - SMAX; /* pointer overflow check is needed */
-  p2 = p + (SMAX - 2); /* b - 2: pointer overflow check is needed */
-  p2 = p + (SMAX - 1); /* b - 1: pointer overflow check is needed */
-  p2 = p + SMAX; /* b: pointer overflow check is needed */
+  p2 = p + (SMAX - 2); /* b - 2: no need to check this  */
+  p2 = p + (SMAX - 1); /* b - 1: no need to check this */
+  p2 = p + SMAX; /* b: no need to check this */
   p2++; /* b + 1 */
 
   p = c;
@@ -75,4 +75,4 @@ void negative_to_negative (char *ptr)
   p2 += 5;
 }
 
-/* { dg-final { scan-tree-dump-times "__ubsan_handle_pointer_overflow" 17 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "__ubsan_handle_pointer_overflow" 14 "optimized" } } */