Быстрый поиск кода базы libstd++
показал следующие два использования __gx_personality_v0
:
В libsupc ++ / unwind-cxx.h
// GNU C++ personality routine, Version 0.
extern "C" _Unwind_Reason_Code __gxx_personality_v0
(int, _Unwind_Action, _Unwind_Exception_Class,
struct _Unwind_Exception *, struct _Unwind_Context *);
В libsupc ++ / eh_personality.cc
#define PERSONALITY_FUNCTION __gxx_personality_v0
extern "C" _Unwind_Reason_Code
PERSONALITY_FUNCTION (int version,
_Unwind_Action actions,
_Unwind_Exception_Class exception_class,
struct _Unwind_Exception *ue_header,
struct _Unwind_Context *context)
{
// ... code to handle exceptions and stuff ...
}
(Примечание: на самом деле все немного сложнее; есть условная компиляция, которая может изменить некоторые детали).
Таким образом, пока ваш код на самом деле не использует обработку исключений, определение символа как void*
ни на что не повлияет, но как только это произойдет, вы потерпите крах - __gxx_personality_v0
- это функция, а не какой-то глобальный объект, поэтому попытка вызова функции приведет к переходу на адрес 0 и вызовет segfault.