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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2024-12-19
            Summary|regex global buffer         |regex global buffer
                   |overflow LTO                |overflow LTO due to IPA
                   |                            |constprop and having 2
                   |                            |different string constants
                   |                            |across both TU
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW
          Component|middle-end                  |lto

--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
This is a LTO only issue.

What is happening is we had originally:
std::regex _r{"\\/some\\/http\\/(\\d{1,2})\\/(\\d{1,2})\\/(\\d{1,2})\\/test",
std::regex::ECMAScript};


But then with IPA-constprop we generate a constprop clone of _M_compile and
call like (in one ltrans):
  _M_compile.constprop (&_r, &MEM <const char[52]> [(void
*)"\\/some\\/http\\/(\\d{1,2})\\/(\\d{1,2})\\/(\\d{1,2})\\/test" + 51B]);

But in the other ltrans we produce:
....
  MEM[(struct _Scanner *)&__c + 8B]._M_current =
"\\/some\\/http\\/(\\d{1,2})\\/(\\d{1,2})\\/(\\d{1,2})\\/test";
...
  MEM[(struct _Scanner *)&__c + 8B]._M_end = __last_3(D);
Where __last_3 is the second argument of _M_compile.constprop.


Now in the 2 ltrans we have 2 different string constants BUT they have
different addresses.

The reason why you need -fsanitize=address to hit the bug is you need a large
enough TU to have it split into 2 ltrans.

Reply via email to