https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79671

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Jakub Jelinek from comment #2)
> E.g. on 122 valgrind says:
> ==21905== Invalid free() / delete / delete[] / realloc()
> ==21905==    at 0x484B224: operator delete(void*) (vg_replace_malloc.c:576)
> ==21905==    by 0x11BB3:
> path_expression_grammar<__gnu_cxx::__normal_iterator<char const*,
> std::__cxx11::basic_string<char, std::char_traits<char>,
> std::allocator<char> > > >::path_expression_grammar() (in /tmp/rh1422456.122)
> ==21905==  Address 0xbd8fd048 is on thread 1's stack
> 
> Looking at tree dumps from PTRS_COMPARE_UNEQUAL=10000 (works) and
> PTRS_COMPARE_UNEQUAL=122 (calls free on invalid arg), I see the first change
> in *.fre1 in path_expression_grammar<Iterator>::path_expression_grammar()
> function,
>    MEM[(struct  &)this_10(D) + 56] ={v} {CLOBBER};
>    MEM[(struct function_base *)this_10(D) + 56B].vtable = 0B;
>    _122 = MEM[(char * *)&D.552047];
> -  if (&D.552047.D.20672._M_local_buf != _122)
> -    goto <bb 9>;
> -  else
> -    goto <bb 10>;
> -
> -  <bb 9>:
>    operator delete (_122);
> -
> -  <bb 10>:
>    MEM[(struct  &)&D.552047] ={v} {CLOBBER};
>    D.552047 ={v} {CLOBBER};
>    D.552048 ={v} {CLOBBER};
>    _29 = &this_10(D)->attr;
> and
> @@ -12334,15 +12330,7 @@ path_expression_grammar<Iterator>::path_
>  
>  <L4>:
>    _140 = MEM[(char * *)&D.552047];
> -  if (&D.552047.D.20672._M_local_buf != _140)
> -    goto <bb 27>;
> -  else
> -    goto <bb 28>;
> -
> -  <bb 27>:
>    operator delete (_140);
> -
> -  <bb 28>:
>    MEM[(struct  &)&D.552047] ={v} {CLOBBER};
>    D.552047 ={v} {CLOBBER};
>    resx 7
> 
> (all other changes are just in bb numbers, as some bbs have been removed in
> the latter case).
> No idea what to figure out from this though, it just removes some operator
> delete calls (free), but that shouldn't cause free being called on invalid,
> worst case just memory leak.

It more looks like it will now call delete on _140 where it might have not
(if equal to &..._M_local_buf).  This smells like a PTA issue and the
question is why D.552047 is thought to not point to
D.552047.D.20672._M_local_buf.

I'm trying to reproduce the above with a cross.

Reply via email to