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.
I co zgłosiłeś to gdzieś? Są jakieś wyniki badań?
Nie zgłaszałem. Podejrzewam, że problem jest jest już rozpoznany i wisi na bugzilli gcc. :-)
Sam ostatnio walczyłem z sytuacją “zaktualizowaliśmy toolchain i program przestał się budować”. Finalnie okazało się, że twórcy GCC nie przewidzieli takiej kombinacji alpejskiej jak kompilacja kodu w C++17 z włączonym -fconcepts. Założyli, że po prostu jak concepts są włączone, to kod na pewno jest kompilowany zgodnie z C++20 i można używać wszystkich funkcji tego standardu.
Commit będący sprawcą zamieszania: https://github.com/gcc-mirror/gcc/commit/142cc4c223d695e515ed2504501b91d8a7ac6eb8 W założeniu ta miana miała naprawiać ten błąd https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113841