On 03/08/2017 12:00 PM, Richard Biener wrote: > On Tue, Mar 7, 2017 at 5:01 PM, Martin Liška <mli...@suse.cz> wrote: >> On 03/07/2017 03:53 PM, Richard Biener wrote: >>> On Tue, Mar 7, 2017 at 3:48 PM, Martin Liška <mli...@suse.cz> wrote: >>>> On 03/07/2017 11:17 AM, Rainer Orth wrote: >>>>> marxin <mli...@suse.cz> writes: >>>>> >>>>>> diff --git a/gcc/testsuite/g++.dg/pr79769.C >>>>>> b/gcc/testsuite/g++.dg/pr79769.C >>>>>> new file mode 100644 >>>>>> index 00000000000..f9223db1b2d >>>>>> --- /dev/null >>>>>> +++ b/gcc/testsuite/g++.dg/pr79769.C >>>>>> @@ -0,0 +1,4 @@ >>>>>> +/* { dg-do compile { target { ! x32 } } } */ >>>>>> +/* { dg-options "-fcheck-pointer-bounds -mmpx -mabi=ms" } */ >>>>> >>>>> ... and again: make this x86-only. >>>>> >>>>> Rainer >>>>> >>>> >>>> Thanks. I'm sending v2 of the patch. >>> >>> Hmm, not sure why we should handle REAL_CST here explicitely for example. >>> >>> Why not, instead of internal_error in the default: case do >>> >>> bounds = chkp_get_invalid_op_bounds (); >> >> Because chkp_get_invalid_op_bounds() returns bounds that are always valid >> and as it's >> security extension, I would be strict here in order to not handle something >> that can bypass >> the checking. >> >>> >>> there? For the testcase why do we invoke chkp_find_bounds_1 on sth that is >>> a REAL_CST for example? >> >> It's called when setting bounds in a call expr: >> >> #0 chkp_find_bounds_1 (ptr=0x7ffff6a03720, ptr_src=0x7ffff6a03720, >> iter=0x7fffffffd5d0) at ../../gcc/tree-chkp.c:3734 >> #1 0x0000000000ec7c7d in chkp_find_bounds (ptr=0x7ffff6a03720, >> iter=0x7fffffffd5d0) at ../../gcc/tree-chkp.c:3768 >> #2 0x0000000000ec22e1 in chkp_add_bounds_to_call_stmt (gsi=0x7fffffffd5d0) >> at ../../gcc/tree-chkp.c:1901 >> #3 0x0000000000ec9a1a in chkp_instrument_function () at >> ../../gcc/tree-chkp.c:4344 >> #4 0x0000000000eca4cb in chkp_execute () at ../../gcc/tree-chkp.c:4528
Yes, as you pointed out, we've got 2 issues here: > > So this happens for calls with mismatched arguments? I believe that > > if (BOUNDED_TYPE_P (type) > || pass_by_reference (NULL, TYPE_MODE (type), type, true)) > new_args.safe_push (chkp_find_bounds (call_arg, gsi)); > > may be misguided given pass_by_reference is not exposed at GIMPLE and thus > for the pass_by_reference case it should fall back to > "chkp_get_invalid_op_bounds" > and thus eventually pass this down as a flag to chkp_find_bounds (or check > on call_arg again). Let's consider a VLA, we then call chkp_find_bounds for call_arg equal to (gdb) p debug_tree(call_arg) <ssa_name 0x7ffff69d5120 type <pointer_type 0x7ffff69c9e70 type <array_type 0x7ffff69c9d20 type <integer_type 0x7ffff688e5e8 int> sizes-gimplified type_1 BLK size <var_decl 0x7ffff69d3360 D.1836> unit size <var_decl 0x7ffff69d33f0 D.1837> align 32 symtab 0 alias set -1 structural equality domain <integer_type 0x7ffff69c9dc8> pointer_to_this <pointer_type 0x7ffff69c9e70>> unsigned DI size <integer_cst 0x7ffff6876cd8 constant 64> unit size <integer_cst 0x7ffff6876cf0 constant 8> align 64 symtab 0 alias set -1 structural equality> visited def_stmt x.2_7 = x.1_20; version 7> where bounds result in: _18 = _6 * 4; x.1_20 = __builtin_alloca_with_align (_18, 32); __bound_tmp.5_24 = __builtin_ia32_bndmk (x.1_20, _18); which is consider fine. I don't understand how can be that broken on gimple as it's not exposed by GIMPLE? > > Note that here 'type' and call_arg may not match (asking for trouble). Plus > 'fntype' is computed bogously (should use gimple_call_fntype). > > It later does sth like > > /* For direct calls fndecl is replaced with instrumented version. */ > if (fndecl) > { > tree new_decl = chkp_maybe_create_clone (fndecl)->decl; > gimple_call_set_fndecl (new_call, new_decl); > /* In case of a type cast we should modify used function > type instead of using type of new fndecl. */ > if (gimple_call_fntype (call) != TREE_TYPE (fndecl)) > { > tree type = gimple_call_fntype (call); > type = chkp_copy_function_type_adding_bounds (type); > gimple_call_set_fntype (new_call, type); > } > else > gimple_call_set_fntype (new_call, TREE_TYPE (new_decl)); > > but obviously if gimple_call_fntype and fndecl don't match cloning > the mismatched decl isn't of very much help ... (it may just generate > more mismatches with mismatching bounds...). That second issue should be probably fixed by comparing each formal and actual arguments, where for a mismatch an invalid bounds should be returned? Am I right? Martin > >> ... >> >> Martin >> >>> >>> Richard. >>> >>>> Martin >>