1 // Copyright 2022 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "partition_alloc/dangling_raw_ptr_checks.h" 6 7 #include "partition_alloc/partition_alloc_base/component_export.h" 8 #include "partition_alloc/partition_alloc_check.h" 9 10 namespace partition_alloc { 11 12 namespace { __anon4af652940202(uintptr_t) 13DanglingRawPtrDetectedFn* g_dangling_raw_ptr_detected_fn = [](uintptr_t) {}; __anon4af652940302(uintptr_t) 14DanglingRawPtrReleasedFn* g_dangling_raw_ptr_released_fn = [](uintptr_t) {}; 15 DanglingRawPtrDetectedFn* g_unretained_dangling_raw_ptr_detected_fn = __anon4af652940402(uintptr_t) 16 [](uintptr_t) {}; 17 bool g_unretained_dangling_raw_ptr_check_enabled = false; 18 } // namespace 19 GetDanglingRawPtrDetectedFn()20DanglingRawPtrDetectedFn* GetDanglingRawPtrDetectedFn() { 21 PA_DCHECK(g_dangling_raw_ptr_detected_fn); 22 return g_dangling_raw_ptr_detected_fn; 23 } 24 GetDanglingRawPtrReleasedFn()25DanglingRawPtrDetectedFn* GetDanglingRawPtrReleasedFn() { 26 PA_DCHECK(g_dangling_raw_ptr_released_fn); 27 return g_dangling_raw_ptr_released_fn; 28 } 29 SetDanglingRawPtrDetectedFn(DanglingRawPtrDetectedFn fn)30void SetDanglingRawPtrDetectedFn(DanglingRawPtrDetectedFn fn) { 31 PA_DCHECK(fn); 32 g_dangling_raw_ptr_detected_fn = fn; 33 } 34 SetDanglingRawPtrReleasedFn(DanglingRawPtrReleasedFn fn)35void SetDanglingRawPtrReleasedFn(DanglingRawPtrReleasedFn fn) { 36 PA_DCHECK(fn); 37 g_dangling_raw_ptr_released_fn = fn; 38 } 39 GetUnretainedDanglingRawPtrDetectedFn()40DanglingRawPtrDetectedFn* GetUnretainedDanglingRawPtrDetectedFn() { 41 return g_unretained_dangling_raw_ptr_detected_fn; 42 } 43 SetUnretainedDanglingRawPtrDetectedFn(DanglingRawPtrDetectedFn * fn)44void SetUnretainedDanglingRawPtrDetectedFn(DanglingRawPtrDetectedFn* fn) { 45 PA_DCHECK(fn); 46 g_unretained_dangling_raw_ptr_detected_fn = fn; 47 } 48 SetUnretainedDanglingRawPtrCheckEnabled(bool enabled)49bool SetUnretainedDanglingRawPtrCheckEnabled(bool enabled) { 50 bool old = g_unretained_dangling_raw_ptr_check_enabled; 51 g_unretained_dangling_raw_ptr_check_enabled = enabled; 52 return old; 53 } 54 55 namespace internal { 56 PA_COMPONENT_EXPORT(PARTITION_ALLOC)57PA_COMPONENT_EXPORT(PARTITION_ALLOC) void DanglingRawPtrDetected(uintptr_t id) { 58 g_dangling_raw_ptr_detected_fn(id); 59 } PA_COMPONENT_EXPORT(PARTITION_ALLOC)60PA_COMPONENT_EXPORT(PARTITION_ALLOC) void DanglingRawPtrReleased(uintptr_t id) { 61 g_dangling_raw_ptr_released_fn(id); 62 } 63 PA_COMPONENT_EXPORT(PARTITION_ALLOC)64PA_COMPONENT_EXPORT(PARTITION_ALLOC) 65 void UnretainedDanglingRawPtrDetected(uintptr_t id) { 66 g_unretained_dangling_raw_ptr_detected_fn(id); 67 } 68 PA_COMPONENT_EXPORT(PARTITION_ALLOC)69PA_COMPONENT_EXPORT(PARTITION_ALLOC) 70 bool IsUnretainedDanglingRawPtrCheckEnabled() { 71 return g_unretained_dangling_raw_ptr_check_enabled; 72 } 73 74 } // namespace internal 75 } // namespace partition_alloc 76