Skip to content

Commit

Permalink
C APIのセーフティネットのメッセージを改善する (#625)
Browse files Browse the repository at this point in the history
  • Loading branch information
qryxip authored Oct 8, 2023
1 parent 030748b commit 8209633
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 3 deletions.
24 changes: 22 additions & 2 deletions crates/voicevox_core_c_api/src/drop_check.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down Expand Up @@ -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の管理下にありません。誤ったポインタであるか、二重解放になっていることが考えられます"
Expand Down
8 changes: 7 additions & 1 deletion crates/voicevox_core_c_api/src/slice_owner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,13 @@ impl<T> SliceOwner<T> {
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);
Expand Down

0 comments on commit 8209633

Please sign in to comment.