@@ -195,9 +195,7 @@ pub fn generate_salt(website: &str, username: &str, counter: u32) -> std::vec::V
195
195
196
196
// SAFETY: `uninit_output` was fully initialized in
197
197
// `generate_salt_to_uninit`.
198
- unsafe {
199
- std:: mem:: transmute :: < std:: vec:: Vec < MaybeUninit < u8 > > , std:: vec:: Vec < u8 > > ( uninit_output)
200
- }
198
+ unsafe { assume_init_vec ( uninit_output) }
201
199
}
202
200
203
201
/// The minimum length of the entropy in bytes, inclusive.
@@ -367,9 +365,7 @@ pub fn render_password(entropy: &[u8], charset: CharacterSet, len: usize) -> std
367
365
368
366
// SAFETY: `uninit_output` was fully initialized in
369
367
// `render_password_to_uninit`.
370
- let output = unsafe {
371
- std:: mem:: transmute :: < std:: vec:: Vec < MaybeUninit < u8 > > , std:: vec:: Vec < u8 > > ( uninit_output)
372
- } ;
368
+ let output = unsafe { assume_init_vec ( uninit_output) } ;
373
369
374
370
// SAFETY: characters are all extracted from `charset`, which only contains
375
371
// a limited set of ASCII characters.
@@ -430,6 +426,15 @@ fn uninit_vec<T>(len: usize) -> std::vec::Vec<MaybeUninit<T>> {
430
426
. collect ( )
431
427
}
432
428
429
+ #[ cfg( feature = "std" ) ]
430
+ #[ inline( always) ]
431
+ unsafe fn assume_init_vec ( mut vec : std:: vec:: Vec < MaybeUninit < u8 > > ) -> std:: vec:: Vec < u8 > {
432
+ let ( ptr, length, capacity) = ( vec. as_mut_ptr ( ) , vec. len ( ) , vec. capacity ( ) ) ;
433
+
434
+ std:: mem:: forget ( vec) ;
435
+ std:: vec:: Vec :: from_raw_parts ( ptr. cast ( ) , length, capacity)
436
+ }
437
+
433
438
#[ cfg( test) ]
434
439
mod fingerprint_tests {
435
440
use super :: * ;
0 commit comments