Terminate if pure virtual function is called

Fixes #2229
This commit is contained in:
Christian Helmuth 2017-03-01 16:14:50 +01:00
parent d82bd3ca77
commit 40f319e9e9

View File

@ -18,19 +18,20 @@
#include <base/thread.h> #include <base/thread.h>
#include <util/string.h> #include <util/string.h>
using namespace Genode; #include <cxxabi.h>
extern "C" void __cxa_pure_virtual() extern "C" void __cxa_pure_virtual()
{ {
Genode::warning("cxa pure virtual function called, return addr is ", Genode::error(__func__, " called, return addr is ", __builtin_return_address(0));
__builtin_return_address(0)); std::terminate();
} }
extern "C" void __pure_virtual() extern "C" void __pure_virtual()
{ {
Genode::warning("pure virtual function called"); Genode::error(__func__, " called, return addr is ", __builtin_return_address(0));
std::terminate();
} }
@ -93,7 +94,7 @@ void __register_frame(void *) { }
*/ */
extern "C" __attribute__((weak)) void raise() extern "C" __attribute__((weak)) void raise()
{ {
warning("cxx: raise called - not implemented"); Genode::warning("cxx: raise called - not implemented");
} }
@ -104,7 +105,7 @@ extern "C" __attribute__((weak)) void raise()
extern "C" void *abort(void) extern "C" void *abort(void)
{ {
Genode::Thread const * const myself = Genode::Thread::myself(); Genode::Thread const * const myself = Genode::Thread::myself();
Thread::Name name = "unknown"; Genode::Thread::Name name = "unknown";
if (myself) if (myself)
name = myself->name(); name = myself->name();
@ -113,9 +114,9 @@ extern "C" void *abort(void)
/* Notify the parent of failure */ /* Notify the parent of failure */
if (name != "main") if (name != "main")
env_deprecated()->parent()->exit(1); Genode::env_deprecated()->parent()->exit(1);
sleep_forever(); Genode::sleep_forever();
return 0; return 0;
} }