#include "catch.hpp" #include "vptr_manager.h" #include "shm.h" class TestBase3 { public: virtual int Do1() { return a; } virtual ~TestBase3() = default; int a = 2; }; class TestBase4 : virtual public TestBase3 { public: virtual int Do1() override { return 4; } }; class TestDrvied1 :virtual public TestBase3, public TestBase4 { public: virtual ~TestDrvied1() = default; }; class TestBase { public: virtual int Do1() { return a; } virtual ~TestBase() = default; int a = 2; }; class TestBase2 { public: virtual int Do1() { return b; } virtual ~TestBase2() = default; int b = 3; }; class TestDrvied :public TestBase, public TestBase2 { public: virtual ~TestDrvied() = default; }; TEST_CASE("VptrObjectContainer, ShmNew Fix ShmDelete", "[TestDrvied][base]") { bg::ShmOptions opts(false, "Test", nullptr); opts.fix_vptr_on_init = false; REQUIRE(bg::ShmInit(opts) == true); TestDrvied* drv = bg::ShmNew(); uintptr_t drv_ptr = *reinterpret_cast(drv); memset(drv, 0, sizeof(TestDrvied)); TestBase* base = static_cast(drv); base->a = 2; TestBase2* base2 = static_cast(drv); base2->b = 3; REQUIRE(*reinterpret_cast(base) == 0); *(uint64_t*)(0x600000006080) = 2; bg::ShmFixVptr(); REQUIRE(*reinterpret_cast(base) == drv_ptr); REQUIRE(*reinterpret_cast(base2) != 0); REQUIRE(base->Do1() == 2); REQUIRE(base2->Do1() == 3); bg::ShmDelete(base); bg::ShmFini(); } TEST_CASE("VptrObjectContainer, ShmNew Fix ShmDelete") { bg::ShmOptions opts(false, "Test", nullptr); opts.fix_vptr_on_init = false; REQUIRE(bg::ShmInit(opts) == true); TestDrvied1* drv = bg::ShmNew(); uintptr_t drv_ptr = *reinterpret_cast(drv); TestBase4* base2 = static_cast(drv); TestBase3* base = static_cast(drv); REQUIRE(base->Do1() == 4); memset(drv, 0, sizeof(TestDrvied)); base->a = 2; REQUIRE(*reinterpret_cast(base) == 0); *(uint64_t*)(0x600000006080) = 2; bg::ShmFixVptr(); REQUIRE(*reinterpret_cast(base2) == drv_ptr); REQUIRE(base->Do1() == 4); REQUIRE(base2->Do1() == 4); bg::ShmDelete(base); bg::ShmFini(); } class TestDrvied3 { public: virtual ~TestDrvied3() = default; }; TEST_CASE("VptrObjectContainer, ShmNew Fix ShmDelete") { bg::ShmOptions opts(false, "Test", nullptr); opts.fix_vptr_on_init = false; REQUIRE(bg::ShmInit(opts) == true); TestDrvied3* drv = bg::ShmNew(); uintptr_t drv_ptr = *reinterpret_cast(drv); memset(drv, 0, sizeof(TestDrvied3)); REQUIRE(*reinterpret_cast(drv) == 0); *(uint64_t*)(0x600000006080) = 2; bg::ShmFixVptr(); REQUIRE(*reinterpret_cast(drv) == drv_ptr); bg::ShmDelete(drv); bg::ShmFini(); }