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.