[PATCH][PR sanitizer/80414] Fix segfault with -fsanitize=undefined on 32 bit host

Jakub Jelinek jakub@redhat.com
Thu Apr 13 13:10:00 GMT 2017


On Thu, Apr 13, 2017 at 12:28:40PM +0300, Denis Khalikov wrote:
> --- /dev/null
> +++ b/gcc/testsuite/c-c++-common/ubsan/bounds-15.c
> @@ -0,0 +1,11 @@
> +/* { dg-do run } */
> +/* { dg-options "-fsanitize=bounds" } */
> +/* { dg-skip-if "" { *-*-* } { "*" } { "-O0" } } */
> +
> +int main()
> +{
> +  long long offset = 10;
> +  char array[10];
> +  char c = array[offset];
> +  return 0;
> +}

I would expect you want to dg-output here the runtime diagnostics,
at least some part of it, to make it clear the testcase is UB and
to test whether the UB is detected.

> diff --git a/gcc/ubsan.c b/gcc/ubsan.c
> index c01d633..9333336 100644
> --- a/gcc/ubsan.c
> +++ b/gcc/ubsan.c
> @@ -672,7 +672,8 @@ ubsan_expand_bounds_ifn (gimple_stmt_iterator *gsi)
>  
>    /* Pick up the arguments of the UBSAN_BOUNDS call.  */
>    tree type = TREE_TYPE (TREE_TYPE (gimple_call_arg (stmt, 0)));
> -  tree index = gimple_call_arg (stmt, 1);
> +  tree index, orig_index;
> +  index = orig_index = gimple_call_arg (stmt, 1);
>    tree orig_index_type = TREE_TYPE (index);

Instead of this I'd suggest:
   tree index = gimple_call_arg (stmt, 1);
-  tree orig_index_type = TREE_TYPE (index);
+  tree orig_index = index;

>    tree bound = gimple_call_arg (stmt, 2);
>  
> @@ -708,9 +709,9 @@ ubsan_expand_bounds_ifn (gimple_stmt_iterator *gsi)
>  	  ? BUILT_IN_UBSAN_HANDLE_OUT_OF_BOUNDS
>  	  : BUILT_IN_UBSAN_HANDLE_OUT_OF_BOUNDS_ABORT;
>        tree fn = builtin_decl_explicit (bcode);
> -      tree val = force_gimple_operand_gsi (gsi, ubsan_encode_value (index),
> -					   true, NULL_TREE, true,
> -					   GSI_SAME_STMT);
> +      tree val
> +	= force_gimple_operand_gsi (gsi, ubsan_encode_value (orig_index), true,
> +				    NULL_TREE, true, GSI_SAME_STMT);
>        g = gimple_build_call (fn, 2, data, val);
>      }
>    gimple_set_location (g, loc);

and replace orig_index_type use with TREE_TYPE (orig_index)

	Jakub



More information about the Gcc-patches mailing list