diff --git a/crates/voicevox_core_c_api/src/drop_check.rs b/crates/voicevox_core_c_api/src/drop_check.rs index 546739dbd..36acec570 100644 --- a/crates/voicevox_core_c_api/src/drop_check.rs +++ b/crates/voicevox_core_c_api/src/drop_check.rs @@ -46,8 +46,15 @@ impl CStringDropChecker { owned_str_addrs, .. } = &mut *self.0.lock().unwrap(); - let duplicated = !owned_str_addrs.insert(s.as_ptr() as usize); - assert!(!duplicated, "duplicated"); + let ptr = s.as_ptr(); + let duplicated = !owned_str_addrs.insert(ptr as usize); + if duplicated { + panic!( + "別の{ptr:p}が管理下にあります。原因としては以前に別の文字列が{ptr:p}として存在\ + しており、それが誤った形で解放されたことが考えられます。このライブラリで生成した\ + オブジェクトの解放は、このライブラリが提供するAPIで行われなくてはなりません", + ); + } s } @@ -100,8 +107,21 @@ impl CStringDropChecker { mod tests { use std::ffi::{c_char, CStr}; + use cstr::cstr; + use super::CStringDropChecker; + #[test] + #[should_panic( + expected = "このライブラリで生成したオブジェクトの解放は、このライブラリが提供するAPIで\ + 行われなくてはなりません" + )] + fn it_denies_duplicated_char_ptr() { + let checker = CStringDropChecker::new(); + let s = cstr!("").to_owned(); + checker.whitelist(checker.whitelist(s)); + } + #[test] #[should_panic( expected = "解放しようとしたポインタはvoicevox_coreの管理下にありません。誤ったポインタであるか、二重解放になっていることが考えられます" diff --git a/crates/voicevox_core_c_api/src/slice_owner.rs b/crates/voicevox_core_c_api/src/slice_owner.rs index 1d95cf935..fa75add52 100644 --- a/crates/voicevox_core_c_api/src/slice_owner.rs +++ b/crates/voicevox_core_c_api/src/slice_owner.rs @@ -47,7 +47,13 @@ impl SliceOwner { let len = slice.len(); let duplicated = slices.insert(ptr as usize, slice.into()).is_some(); - assert!(!duplicated, "duplicated"); + if duplicated { + panic!( + "別の{ptr:p}が管理下にあります。原因としては以前に別の配列が{ptr:p}として存在\ + しており、それが誤った形で解放されたことが考えられます。このライブラリで生成した\ + オブジェクトの解放は、このライブラリが提供するAPIで行われなくてはなりません", + ); + } out_ptr.as_ptr().write_unaligned(ptr); out_len.as_ptr().write_unaligned(len);