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.

  • サぺル
    link
    fedilink
    Polski
    arrow-up
    1
    ·
    2 months ago

    I co zgłosiłeś to gdzieś? Są jakieś wyniki badań?

    • naurOPM
      link
      fedilink
      Polski
      arrow-up
      1
      ·
      2 months ago

      Nie zgłaszałem. Podejrzewam, że problem jest jest już rozpoznany i wisi na bugzilli gcc. :-)

  • Lacky
    link
    fedilink
    arrow-up
    1
    ·
    edit-2
    2 months ago

    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