re PR sanitizer/83392 (FAIL: c-c++-common/ubsan/ptr-overflow-sanitization-1.c scan-tree-dump-times)
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
This commit is contained in:
parent
2062c40cb5
commit
be9dd15c70
@ -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>
|
||||
|
13
gcc/sanopt.c
13
gcc/sanopt.c
@ -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);
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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" } } */
|
||||
|
Loading…
Reference in New Issue
Block a user