From 2c9f644ec22331056ca2d052705ef6f7da7428f7 Mon Sep 17 00:00:00 2001 From: Ryo Yamashita Date: Sat, 30 Sep 2023 02:48:50 +0900 Subject: [PATCH 1/5] =?UTF-8?q?C=20API=E3=81=AE=E3=82=BB=E3=83=BC=E3=83=95?= =?UTF-8?q?=E3=83=86=E3=82=A3=E3=83=8D=E3=83=83=E3=83=88=E3=81=AE=E3=83=A1?= =?UTF-8?q?=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=82=92=E6=94=B9=E5=96=84?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/voicevox_core_c_api/src/drop_check.rs | 10 ++++++++-- crates/voicevox_core_c_api/src/slice_owner.rs | 7 ++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/crates/voicevox_core_c_api/src/drop_check.rs b/crates/voicevox_core_c_api/src/drop_check.rs index 546739dbd..cd215c99f 100644 --- a/crates/voicevox_core_c_api/src/drop_check.rs +++ b/crates/voicevox_core_c_api/src/drop_check.rs @@ -46,8 +46,14 @@ 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); + assert!( + !duplicated, + "{ptr:p}として管理される別の文字列が存在しています。原因としては文字列が誤った形で解放\ + されたことが考えられます。このライブラリで生成したオブジェクトの解放は、このライブラリ\ + が提供するAPIで行われなくてはなりません", + ); s } diff --git a/crates/voicevox_core_c_api/src/slice_owner.rs b/crates/voicevox_core_c_api/src/slice_owner.rs index 1d95cf935..ad6b2032f 100644 --- a/crates/voicevox_core_c_api/src/slice_owner.rs +++ b/crates/voicevox_core_c_api/src/slice_owner.rs @@ -47,7 +47,12 @@ impl SliceOwner { let len = slice.len(); let duplicated = slices.insert(ptr as usize, slice.into()).is_some(); - assert!(!duplicated, "duplicated"); + assert!( + !duplicated, + "{ptr:p}として管理される別の配列が存在しています。原因としては配列が誤った形で解放\ + されたことが考えられます。このライブラリで生成したオブジェクトの解放は、このライブラリ\ + が提供するAPIで行われなくてはなりません", + ); out_ptr.as_ptr().write_unaligned(ptr); out_len.as_ptr().write_unaligned(len); From 2561fda9734b00696637e960351725560a969958 Mon Sep 17 00:00:00 2001 From: Ryo Yamashita Date: Sat, 30 Sep 2023 03:07:07 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=82=92=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/voicevox_core_c_api/src/drop_check.rs | 4 ++-- crates/voicevox_core_c_api/src/slice_owner.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/voicevox_core_c_api/src/drop_check.rs b/crates/voicevox_core_c_api/src/drop_check.rs index cd215c99f..218d2b87f 100644 --- a/crates/voicevox_core_c_api/src/drop_check.rs +++ b/crates/voicevox_core_c_api/src/drop_check.rs @@ -50,8 +50,8 @@ impl CStringDropChecker { let duplicated = !owned_str_addrs.insert(ptr as usize); assert!( !duplicated, - "{ptr:p}として管理される別の文字列が存在しています。原因としては文字列が誤った形で解放\ - されたことが考えられます。このライブラリで生成したオブジェクトの解放は、このライブラリ\ + "別の{ptr:p}が管理下にあります。原因としては以前の文字列{ptr:p}が誤った形で解放された\ + ことが考えられます。このライブラリで生成したオブジェクトの解放は、このライブラリ\ が提供するAPIで行われなくてはなりません", ); s diff --git a/crates/voicevox_core_c_api/src/slice_owner.rs b/crates/voicevox_core_c_api/src/slice_owner.rs index ad6b2032f..b4081e6c6 100644 --- a/crates/voicevox_core_c_api/src/slice_owner.rs +++ b/crates/voicevox_core_c_api/src/slice_owner.rs @@ -49,8 +49,8 @@ impl SliceOwner { let duplicated = slices.insert(ptr as usize, slice.into()).is_some(); assert!( !duplicated, - "{ptr:p}として管理される別の配列が存在しています。原因としては配列が誤った形で解放\ - されたことが考えられます。このライブラリで生成したオブジェクトの解放は、このライブラリ\ + "別の{ptr:p}が管理下にあります。原因としては以前の配列{ptr:p}が誤った形で解放された\ + ことが考えられます。このライブラリで生成したオブジェクトの解放は、このライブラリ\ が提供するAPIで行われなくてはなりません", ); From b27f1b0f3924ee4ea50f45f339a46e722c0c1823 Mon Sep 17 00:00:00 2001 From: Ryo Yamashita Date: Sat, 30 Sep 2023 12:17:08 +0900 Subject: [PATCH 3/5] =?UTF-8?q?`assert!(p,=20"=E2=80=A6")`=20=E2=86=92=20`?= =?UTF-8?q?if=20!p=20{=20panic!("=E2=80=A6");=20}`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/voicevox_core_c_api/src/drop_check.rs | 13 +++++++------ crates/voicevox_core_c_api/src/slice_owner.rs | 13 +++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/crates/voicevox_core_c_api/src/drop_check.rs b/crates/voicevox_core_c_api/src/drop_check.rs index 218d2b87f..8a60c568d 100644 --- a/crates/voicevox_core_c_api/src/drop_check.rs +++ b/crates/voicevox_core_c_api/src/drop_check.rs @@ -48,12 +48,13 @@ impl CStringDropChecker { let ptr = s.as_ptr(); let duplicated = !owned_str_addrs.insert(ptr as usize); - assert!( - !duplicated, - "別の{ptr:p}が管理下にあります。原因としては以前の文字列{ptr:p}が誤った形で解放された\ - ことが考えられます。このライブラリで生成したオブジェクトの解放は、このライブラリ\ - が提供するAPIで行われなくてはなりません", - ); + if duplicated { + panic!( + "別の{ptr:p}が管理下にあります。原因としては以前の文字列{ptr:p}が誤った形で解放\ + されたことが考えられます。このライブラリで生成したオブジェクトの解放は、この\ + ライブラリが提供するAPIで行われなくてはなりません", + ); + } s } diff --git a/crates/voicevox_core_c_api/src/slice_owner.rs b/crates/voicevox_core_c_api/src/slice_owner.rs index b4081e6c6..62c38a4cd 100644 --- a/crates/voicevox_core_c_api/src/slice_owner.rs +++ b/crates/voicevox_core_c_api/src/slice_owner.rs @@ -47,12 +47,13 @@ impl SliceOwner { let len = slice.len(); let duplicated = slices.insert(ptr as usize, slice.into()).is_some(); - assert!( - !duplicated, - "別の{ptr:p}が管理下にあります。原因としては以前の配列{ptr:p}が誤った形で解放された\ - ことが考えられます。このライブラリで生成したオブジェクトの解放は、このライブラリ\ - が提供するAPIで行われなくてはなりません", - ); + if duplicated { + panic!( + "別の{ptr:p}が管理下にあります。原因としては以前の配列{ptr:p}が誤った形で解放\ + されたことが考えられます。このライブラリで生成したオブジェクトの解放は、この\ + ライブラリが提供するAPIで行われなくてはなりません", + ); + } out_ptr.as_ptr().write_unaligned(ptr); out_len.as_ptr().write_unaligned(len); From 5718353fee723b4879ac4c201aedd6653e72752c Mon Sep 17 00:00:00 2001 From: Ryo Yamashita Date: Mon, 2 Oct 2023 01:15:46 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=82=92=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/voicevox_core_c_api/src/drop_check.rs | 6 +++--- crates/voicevox_core_c_api/src/slice_owner.rs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/voicevox_core_c_api/src/drop_check.rs b/crates/voicevox_core_c_api/src/drop_check.rs index 8a60c568d..84c697063 100644 --- a/crates/voicevox_core_c_api/src/drop_check.rs +++ b/crates/voicevox_core_c_api/src/drop_check.rs @@ -50,9 +50,9 @@ impl CStringDropChecker { let duplicated = !owned_str_addrs.insert(ptr as usize); if duplicated { panic!( - "別の{ptr:p}が管理下にあります。原因としては以前の文字列{ptr:p}が誤った形で解放\ - されたことが考えられます。このライブラリで生成したオブジェクトの解放は、この\ - ライブラリが提供するAPIで行われなくてはなりません", + "別の{ptr:p}が管理下にあります。原因としては以前に別の文字列が{ptr:p}として存在\ + しており、それが誤った形で解放されたことが考えられます。このライブラリで生成した\ + オブジェクトの解放は、このライブラリが提供するAPIで行われなくてはなりません", ); } s diff --git a/crates/voicevox_core_c_api/src/slice_owner.rs b/crates/voicevox_core_c_api/src/slice_owner.rs index 62c38a4cd..fa75add52 100644 --- a/crates/voicevox_core_c_api/src/slice_owner.rs +++ b/crates/voicevox_core_c_api/src/slice_owner.rs @@ -49,9 +49,9 @@ impl SliceOwner { let duplicated = slices.insert(ptr as usize, slice.into()).is_some(); if duplicated { panic!( - "別の{ptr:p}が管理下にあります。原因としては以前の配列{ptr:p}が誤った形で解放\ - されたことが考えられます。このライブラリで生成したオブジェクトの解放は、この\ - ライブラリが提供するAPIで行われなくてはなりません", + "別の{ptr:p}が管理下にあります。原因としては以前に別の配列が{ptr:p}として存在\ + しており、それが誤った形で解放されたことが考えられます。このライブラリで生成した\ + オブジェクトの解放は、このライブラリが提供するAPIで行われなくてはなりません", ); } From 080b2be5e73f52dd317b334bfba3bf61c1066008 Mon Sep 17 00:00:00 2001 From: Ryo Yamashita Date: Sun, 8 Oct 2023 14:52:31 +0900 Subject: [PATCH 5/5] =?UTF-8?q?`drop=5Fcheck`=E3=81=AE=E6=96=B9=E3=81=AB?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E5=85=A5=E3=82=8C=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/voicevox_core_c_api/src/drop_check.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/crates/voicevox_core_c_api/src/drop_check.rs b/crates/voicevox_core_c_api/src/drop_check.rs index 84c697063..36acec570 100644 --- a/crates/voicevox_core_c_api/src/drop_check.rs +++ b/crates/voicevox_core_c_api/src/drop_check.rs @@ -107,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の管理下にありません。誤ったポインタであるか、二重解放になっていることが考えられます"