diff options
| author | 2021-08-06 15:38:59 -0700 | |
|---|---|---|
| committer | 2021-08-06 15:40:20 -0700 | |
| commit | c6746a7cb87c4a146ad3e16fffcf3c44e5b59dcf (patch) | |
| tree | 60e8e5743f04cc3d109f6d9c6620d5eb2b6bddf7 | |
| parent | 5d4f84df73627101d47341429e00b04448755aff (diff) | |
SharedRefBase: detect double-ownership
If the internal SharedRefBase weak_ptr is promotable while it is being
destroyed, this means that the SharedRefBase object is double-owned, and
something else deleted it. Add an explicit log for this case.
Fixes: 194905504
Test: libbinder_ndk_unit_test
Change-Id: Ib6aa09ff8e659e52eebe96c14d127a6e7c186cff
| -rw-r--r-- | libs/binder/ndk/include_cpp/android/binder_interface_utils.h | 6 | ||||
| -rw-r--r-- | libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp | 11 |
2 files changed, 17 insertions, 0 deletions
diff --git a/libs/binder/ndk/include_cpp/android/binder_interface_utils.h b/libs/binder/ndk/include_cpp/android/binder_interface_utils.h index 6c4472632d..5de64f8c5c 100644 --- a/libs/binder/ndk/include_cpp/android/binder_interface_utils.h +++ b/libs/binder/ndk/include_cpp/android/binder_interface_utils.h @@ -55,6 +55,12 @@ class SharedRefBase { std::call_once(mFlagThis, [&]() { __assert(__FILE__, __LINE__, "SharedRefBase: no ref created during lifetime"); }); + + if (ref() != nullptr) { + __assert(__FILE__, __LINE__, + "SharedRefBase: destructed but still able to lock weak_ptr. Is this object " + "double-owned?"); + } } /** diff --git a/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp b/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp index 5ad390e107..b5c06e9089 100644 --- a/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp +++ b/libs/binder/ndk/tests/libbinder_ndk_unit_test.cpp @@ -224,6 +224,17 @@ bool isServiceRunning(const char* serviceName) { return true; } +TEST(NdkBinder, DetectDoubleOwn) { + auto badService = ndk::SharedRefBase::make<MyBinderNdkUnitTest>(); + EXPECT_DEATH(std::shared_ptr<MyBinderNdkUnitTest>(badService.get()), + "Is this object double-owned?"); +} + +TEST(NdkBinder, DetectNoSharedRefBaseCreated) { + EXPECT_DEATH(std::make_shared<MyBinderNdkUnitTest>(), + "SharedRefBase: no ref created during lifetime"); +} + TEST(NdkBinder, GetServiceThatDoesntExist) { sp<IFoo> foo = IFoo::getService("asdfghkl;"); EXPECT_EQ(nullptr, foo.get()); |