Wczoraj dostałem załączony fragment kodu C++ z pytaniem, czemu po włączeniu UB sanitizera skompilowany program wybucha.
Zamieszczam jako przykład autentycznego błędu w kompilatorze, bo na serio raczej rzadko coś takiego się dzisiaj widzi.
Zerknijcie w kodzie asemblera na listing funkcji f::h(unsigned long, void (c::*)())
.
W linii 16 następuje skok do etykiety .L3
, gdzie odczytywany jest rejestr R14
. Powinna być w nim wartość parametru idx
funkcji.
Problem w tym, że R14
nie został jeszcze nigdzie ustawiony (prawidłowa wartość jest w RSI
).
Zacząłem się teraz zastanawiać, czy może w kodzie UB sanitizera jest jakiś undefined behaviour. ;-)
Clang kompiluje ten kod bez problemu.
Nie zgłaszałem. Podejrzewam, że problem jest jest już rozpoznany i wisi na bugzilli gcc. :-)