Skip to content

Commit abe964e

Browse files
authored
Mark unsound public methods as private utility functions (#445)
* Marking cast_ptr_to_slice and cast_ptr_to_slice_mut unsafe * Add # Safety section to cast_ptr_to_slice_mut's doc * Mark unsound public methods as private utility functions
1 parent c9351f4 commit abe964e

File tree

2 files changed

+50
-46
lines changed

2 files changed

+50
-46
lines changed

definitions/src/asm.rs

-18
Original file line numberDiff line numberDiff line change
@@ -164,21 +164,3 @@ impl AsmCoreMachine {
164164
self.max_cycles = cycles;
165165
}
166166
}
167-
168-
impl AsmCoreMachine {
169-
pub fn cast_ptr_to_slice(&self, ptr: u64, offset: usize, size: usize) -> &[u8] {
170-
unsafe {
171-
let ptr = ptr as *mut u8;
172-
let ptr = ptr.add(offset);
173-
std::slice::from_raw_parts(ptr, size)
174-
}
175-
}
176-
177-
pub fn cast_ptr_to_slice_mut(&self, ptr: u64, offset: usize, size: usize) -> &mut [u8] {
178-
unsafe {
179-
let ptr = ptr as *mut u8;
180-
let ptr = ptr.add(offset);
181-
std::slice::from_raw_parts_mut(ptr, size)
182-
}
183-
}
184-
}

src/machine/asm/mod.rs

+50-28
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,12 @@ impl CoreMachine for Box<AsmCoreMachine> {
8181
#[no_mangle]
8282
pub extern "C" fn inited_memory(frame_index: u64, machine: &mut AsmCoreMachine) {
8383
let addr_from = (frame_index << MEMORY_FRAME_SHIFTS) as usize;
84-
let slice =
85-
machine.cast_ptr_to_slice_mut(machine.memory_ptr, addr_from, 1 << MEMORY_FRAME_SHIFTS);
84+
let slice = cast_ptr_to_slice_mut(
85+
machine,
86+
machine.memory_ptr,
87+
addr_from,
88+
1 << MEMORY_FRAME_SHIFTS,
89+
);
8690
if machine.chaos_mode != 0 {
8791
let mut gen = rand::rngs::StdRng::seed_from_u64(machine.chaos_seed.into());
8892
gen.fill_bytes(slice);
@@ -236,9 +240,7 @@ impl<'a> FastMemory<'a> {
236240
let page_indices = get_page_indices(addr, size);
237241
for page in page_indices.0..=page_indices.1 {
238242
let frame_index = page >> MEMORY_FRAME_PAGE_SHIFTS;
239-
let slice = self
240-
.0
241-
.cast_ptr_to_slice_mut(self.0.frames_ptr, frame_index as usize, 1);
243+
let slice = cast_ptr_to_slice_mut(self.0, self.0.frames_ptr, frame_index as usize, 1);
242244
slice[0] = 1;
243245
self.0.set_flag(page, FLAG_DIRTY)?;
244246
}
@@ -254,9 +256,7 @@ impl<'a> Memory for FastMemory<'a> {
254256
return Ok(());
255257
}
256258
self.prepare_memory(addr, value.len() as u64)?;
257-
let slice = self
258-
.0
259-
.cast_ptr_to_slice_mut(self.0.memory_ptr, addr as usize, value.len());
259+
let slice = cast_ptr_to_slice_mut(self.0, self.0.memory_ptr, addr as usize, value.len());
260260
slice.copy_from_slice(value);
261261
Ok(())
262262
}
@@ -266,9 +266,7 @@ impl<'a> Memory for FastMemory<'a> {
266266
return Ok(());
267267
}
268268
self.prepare_memory(addr, size)?;
269-
let slice = self
270-
.0
271-
.cast_ptr_to_slice_mut(self.0.memory_ptr, addr as usize, size as usize);
269+
let slice = cast_ptr_to_slice_mut(self.0, self.0.memory_ptr, addr as usize, size as usize);
272270
memset(slice, value);
273271
Ok(())
274272
}
@@ -361,9 +359,9 @@ impl Memory for Box<AsmCoreMachine> {
361359
type REG = u64;
362360

363361
fn reset_memory(&mut self) -> Result<(), Error> {
364-
let slice = self.cast_ptr_to_slice_mut(self.flags_ptr, 0, self.flags_size as usize);
362+
let slice = cast_ptr_to_slice_mut(self, self.flags_ptr, 0, self.flags_size as usize);
365363
memset(slice, 0);
366-
let slice = self.cast_ptr_to_slice_mut(self.frames_ptr, 0, self.frames_size as usize);
364+
let slice = cast_ptr_to_slice_mut(self, self.frames_ptr, 0, self.frames_size as usize);
367365
memset(slice, 0);
368366
self.load_reservation_address = u64::MAX;
369367
self.last_read_frame = u64::MAX;
@@ -428,7 +426,7 @@ impl Memory for Box<AsmCoreMachine> {
428426

429427
fn fetch_flag(&mut self, page: u64) -> Result<u8, Error> {
430428
if page < self.memory_pages() as u64 {
431-
let slice = self.cast_ptr_to_slice(self.flags_ptr, page as usize, 1);
429+
let slice = cast_ptr_to_slice(self, self.flags_ptr, page as usize, 1);
432430
Ok(slice[0])
433431
} else {
434432
Err(Error::MemOutOfBound(
@@ -440,7 +438,7 @@ impl Memory for Box<AsmCoreMachine> {
440438

441439
fn set_flag(&mut self, page: u64, flag: u8) -> Result<(), Error> {
442440
if page < self.memory_pages() as u64 {
443-
let slice = self.cast_ptr_to_slice_mut(self.flags_ptr, page as usize, 1);
441+
let slice = cast_ptr_to_slice_mut(self, self.flags_ptr, page as usize, 1);
444442
slice[0] |= flag;
445443
// Clear last write page cache
446444
self.last_write_page = u64::MAX;
@@ -455,7 +453,7 @@ impl Memory for Box<AsmCoreMachine> {
455453

456454
fn clear_flag(&mut self, page: u64, flag: u8) -> Result<(), Error> {
457455
if page < self.memory_pages() as u64 {
458-
let slice = self.cast_ptr_to_slice_mut(self.flags_ptr, page as usize, 1);
456+
let slice = cast_ptr_to_slice_mut(self, self.flags_ptr, page as usize, 1);
459457
slice[0] &= !flag;
460458
// Clear last write page cache
461459
self.last_write_page = u64::MAX;
@@ -483,7 +481,7 @@ impl Memory for Box<AsmCoreMachine> {
483481
check_memory(self, page);
484482
self.set_flag(page, FLAG_DIRTY)?;
485483
}
486-
let slice = self.cast_ptr_to_slice_mut(self.memory_ptr, addr as usize, value.len());
484+
let slice = cast_ptr_to_slice_mut(self, self.memory_ptr, addr as usize, value.len());
487485
slice.copy_from_slice(value);
488486
Ok(())
489487
}
@@ -499,7 +497,7 @@ impl Memory for Box<AsmCoreMachine> {
499497
check_memory(self, page);
500498
self.set_flag(page, FLAG_DIRTY)?;
501499
}
502-
let slice = self.cast_ptr_to_slice_mut(self.memory_ptr, addr as usize, size as usize);
500+
let slice = cast_ptr_to_slice_mut(self, self.memory_ptr, addr as usize, size as usize);
503501
memset(slice, value);
504502
Ok(())
505503
}
@@ -523,72 +521,72 @@ impl Memory for Box<AsmCoreMachine> {
523521

524522
fn execute_load16(&mut self, addr: u64) -> Result<u16, Error> {
525523
check_memory_executable(self, addr, 2)?;
526-
let slice = self.cast_ptr_to_slice(self.memory_ptr, addr as usize, 2);
524+
let slice = cast_ptr_to_slice(self, self.memory_ptr, addr as usize, 2);
527525
Ok(LittleEndian::read_u16(slice))
528526
}
529527

530528
fn execute_load32(&mut self, addr: u64) -> Result<u32, Error> {
531529
check_memory_executable(self, addr, 4)?;
532-
let slice = self.cast_ptr_to_slice(self.memory_ptr, addr as usize, 4);
530+
let slice = cast_ptr_to_slice(self, self.memory_ptr, addr as usize, 4);
533531
Ok(LittleEndian::read_u32(slice))
534532
}
535533

536534
fn load8(&mut self, addr: &u64) -> Result<u64, Error> {
537535
let addr = *addr;
538536
check_memory_inited(self, addr, 1)?;
539-
let slice = self.cast_ptr_to_slice(self.memory_ptr, addr as usize, 1);
537+
let slice = cast_ptr_to_slice(self, self.memory_ptr, addr as usize, 1);
540538
Ok(u64::from(slice[0]))
541539
}
542540

543541
fn load16(&mut self, addr: &u64) -> Result<u64, Error> {
544542
let addr = *addr;
545543
check_memory_inited(self, addr, 2)?;
546-
let slice = self.cast_ptr_to_slice(self.memory_ptr, addr as usize, 2);
544+
let slice = cast_ptr_to_slice(self, self.memory_ptr, addr as usize, 2);
547545
Ok(u64::from(LittleEndian::read_u16(slice)))
548546
}
549547

550548
fn load32(&mut self, addr: &u64) -> Result<u64, Error> {
551549
let addr = *addr;
552550
check_memory_inited(self, addr, 4)?;
553-
let slice = self.cast_ptr_to_slice(self.memory_ptr, addr as usize, 4);
551+
let slice = cast_ptr_to_slice(self, self.memory_ptr, addr as usize, 4);
554552
Ok(u64::from(LittleEndian::read_u32(slice)))
555553
}
556554

557555
fn load64(&mut self, addr: &u64) -> Result<u64, Error> {
558556
let addr = *addr;
559557
check_memory_inited(self, addr, 8)?;
560-
let slice = self.cast_ptr_to_slice(self.memory_ptr, addr as usize, 8);
558+
let slice = cast_ptr_to_slice(self, self.memory_ptr, addr as usize, 8);
561559
Ok(LittleEndian::read_u64(slice))
562560
}
563561

564562
fn store8(&mut self, addr: &u64, value: &u64) -> Result<(), Error> {
565563
let addr = *addr;
566564
check_memory_writable(self, addr, 1)?;
567-
let slice = self.cast_ptr_to_slice_mut(self.memory_ptr, addr as usize, 1);
565+
let slice = cast_ptr_to_slice_mut(self, self.memory_ptr, addr as usize, 1);
568566
slice[0] = *value as u8;
569567
Ok(())
570568
}
571569

572570
fn store16(&mut self, addr: &u64, value: &u64) -> Result<(), Error> {
573571
let addr = *addr;
574572
check_memory_writable(self, addr, 2)?;
575-
let slice = self.cast_ptr_to_slice_mut(self.memory_ptr, addr as usize, 2);
573+
let slice = cast_ptr_to_slice_mut(self, self.memory_ptr, addr as usize, 2);
576574
LittleEndian::write_u16(slice, *value as u16);
577575
Ok(())
578576
}
579577

580578
fn store32(&mut self, addr: &u64, value: &u64) -> Result<(), Error> {
581579
let addr = *addr;
582580
check_memory_writable(self, addr, 4)?;
583-
let slice = self.cast_ptr_to_slice_mut(self.memory_ptr, addr as usize, 4);
581+
let slice = cast_ptr_to_slice_mut(self, self.memory_ptr, addr as usize, 4);
584582
LittleEndian::write_u32(slice, *value as u32);
585583
Ok(())
586584
}
587585

588586
fn store64(&mut self, addr: &u64, value: &u64) -> Result<(), Error> {
589587
let addr = *addr;
590588
check_memory_writable(self, addr, 8)?;
591-
let slice = self.cast_ptr_to_slice_mut(self.memory_ptr, addr as usize, 8);
589+
let slice = cast_ptr_to_slice_mut(self, self.memory_ptr, addr as usize, 8);
592590
LittleEndian::write_u64(slice, *value as u64);
593591
Ok(())
594592
}
@@ -778,6 +776,30 @@ impl AsmMachine {
778776
}
779777
}
780778

779+
// Casts a raw pointer with an offset and size to a byte slice.
780+
// We need machine here for the lifetime.
781+
fn cast_ptr_to_slice(_machine: &AsmCoreMachine, ptr: u64, offset: usize, size: usize) -> &[u8] {
782+
unsafe {
783+
let ptr = ptr as *const u8;
784+
let ptr = ptr.add(offset);
785+
std::slice::from_raw_parts(ptr, size)
786+
}
787+
}
788+
789+
// Provides similar functionality to `cast_ptr_to_slice` but returns mut slice.
790+
fn cast_ptr_to_slice_mut(
791+
_machine: &AsmCoreMachine,
792+
ptr: u64,
793+
offset: usize,
794+
size: usize,
795+
) -> &mut [u8] {
796+
unsafe {
797+
let ptr = ptr as *mut u8;
798+
let ptr = ptr.add(offset);
799+
std::slice::from_raw_parts_mut(ptr, size)
800+
}
801+
}
802+
781803
#[cfg(test)]
782804
mod tests {
783805
use ckb_vm_definitions::asm::TRACE_ITEM_LENGTH;

0 commit comments

Comments
 (0)