Crate clucstr [−] [src]
Secure creation of CStr with zero cost. Plugin for rust compiler.
Use
#![feature(plugin)] #![plugin(clucstr)] use std::ffi::CStr; fn main() { let c_str = cstr!("cluWorld!!!"); let c_str_barr = cstr!(b"cluWorld!!!"); let c_str_b = cstr!(b'A'); }
#![feature(plugin)] #![plugin(clucstr)] use std::ffi::CStr; fn main() { println_str(cstr!("cluWorld!!!")); //CSTR "cluWorld!!!" //CArray [99, 108, 117, 87, 111, 114, 108, 100, 33, 33, 33, 0] 12 println_str(cstr!(b"cluWorld!!!")); //CSTR "cluWorld!!!" //CArray [99, 108, 117, 87, 111, 114, 108, 100, 33, 33, 33, 0] 12 println_str(cstr!(b'A')); //CSTR "A" //CArray [65, 0] 2 } fn println_str(cstr: &CStr) { println!("CSTR {:?}", cstr); let cstr_array = cstr.to_bytes_with_nul(); println!("CArray {:?} {}", cstr_array, cstr_array.len()); println!(); }
Panic
#![feature(plugin)] #![plugin(clucstr)] use std::ffi::CStr; fn main() { let c_str = cstr!("\0Test_str"); // PANIC! A null byte was found. let c_str = cstr!(b"\0Test_array"); // PANIC! A null byte was found. let c_str = cstr!("Test_str\0"); //It is allowed to write since the null byte is at the end. let c_str = cstr!(b"Test_str\0"); //It is allowed to write since the null byte is at the end. }
Benchmarking
cstr_macros - old method of converting strings to cstr. Note that in CStr, there is no protection from null bytes.
cstr_plugin - new method for converting strings to cstr.
#![feature(plugin)] #![plugin(clucstr)] #![feature(test)] extern crate test; use std::ffi::CStr; #[macro_export] macro_rules! cstr_macro { ($s:expr) => { unsafe { ::std::ffi::CStr::from_ptr( concat!($s, "\0") as *const str as *const [::std::os::raw::c_char] as *const ::std::os::raw::c_char ) } }; } #[cfg(test)] mod tests { use super::*; use test::Bencher; #[bench] fn cstr_plugin(b: &mut Bencher) { b.iter(|| { for _a in 0..10 { let _cstr0 = cstr!(b"test"); } }); } #[bench] fn cstr_macros(b: &mut Bencher) { b.iter(|| { for _a in 0..10 { let _cstr0 = cstr_macro!("test"); } }); } }
running 2 tests
test tests::cstr_macros ... bench: 90 ns/iter (+/- 14)
test tests::cstr_plugin ... bench: 0 ns/iter (+/- 0)
Macros
cstr |
Secure creation of CStr with zero cost |