Я заметил, что и Clang, и GCC генерируют информацию о типах для неполиморфных типов с виртуальным наследованием. Как я понял, по стандарту этого не требуется. Почему они это делают, и как это используется?
Пример:
#include <iostream>
#include <string>
#include <typeinfo>
struct VirtualBase {};
struct Derived : virtual VirtualBase{};
int main()
{
Derived md;
uintptr_t **vptr = (uintptr_t **)&md;
std::type_info * tinfo = (std::type_info *)(*vptr)[-1];
std::cout << tinfo->name() << "\n";
return 0;
}
Выход: 7Derived
После прочтения документации ABI я ожидал получить segfault вместо ответа:
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#vtable-components
Указатель typeinfo является допустимым указателем для полиморфных классов, т. е. для классов с виртуальными функциями, и равен нулю для неполиморфных классов.