Skip to content

Commit f33bac3

Browse files
committed
test memory reads
1 parent 8dbe068 commit f33bac3

File tree

1 file changed

+104
-0
lines changed
  • actors/evm/src/interpreter/instructions

1 file changed

+104
-0
lines changed

actors/evm/src/interpreter/instructions/memory.rs

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,7 @@ mod tests {
479479
assert_eq!(m.state.stack.pop().unwrap(), U256::from(64));
480480
};
481481
}
482+
482483
#[test]
483484
fn test_msize_basic() {
484485
// Demonstrate that MSIZE depends on memory.len()
@@ -493,4 +494,107 @@ mod tests {
493494
assert_eq!(m.state.stack.pop().unwrap(), U256::from(32));
494495
};
495496
}
497+
498+
macro_rules! check_mem {
499+
($mem:ident, $region:ident, $len:expr) => {
500+
match $region {
501+
Some(MemoryRegion { offset, size }) => {
502+
let sizeu: usize = size.into();
503+
assert!(sizeu == $len);
504+
assert!($mem.len() >= offset + sizeu);
505+
for x in offset..offset + sizeu {
506+
assert_eq!($mem[x], 0);
507+
}
508+
}
509+
None => {
510+
panic!("no memory region");
511+
}
512+
}
513+
};
514+
}
515+
516+
#[test]
517+
fn test_memread_simple() {
518+
// simple read in bounds
519+
let mut mem = Memory::default();
520+
mem.grow(1024);
521+
assert_eq!(mem.len(), 1024);
522+
523+
let region = get_memory_region(&mut mem, 0, 512).expect("memory read failed");
524+
check_mem!(mem, region, 512);
525+
}
526+
527+
#[test]
528+
fn test_memread_simple2() {
529+
// simple read in bounds
530+
let mut mem = Memory::default();
531+
mem.grow(1024);
532+
assert_eq!(mem.len(), 1024);
533+
534+
let region = get_memory_region(&mut mem, 128, 512).expect("memory read failed");
535+
check_mem!(mem, region, 512);
536+
}
537+
538+
#[test]
539+
fn test_memread_simple3() {
540+
// simple read in bounds
541+
let mut mem = Memory::default();
542+
mem.grow(1024);
543+
assert_eq!(mem.len(), 1024);
544+
545+
let region = get_memory_region(&mut mem, 512, 512).expect("memory read failed");
546+
check_mem!(mem, region, 512);
547+
}
548+
549+
#[test]
550+
fn test_memread_empty() {
551+
let mut mem = Memory::default();
552+
mem.grow(1024);
553+
assert_eq!(mem.len(), 1024);
554+
555+
let region = get_memory_region(&mut mem, 512, 0).expect("memory read failed");
556+
assert!(region.is_none());
557+
}
558+
559+
#[test]
560+
fn test_memread_overflow1() {
561+
// len > mem size
562+
let mut mem = Memory::default();
563+
mem.grow(1024);
564+
assert_eq!(mem.len(), 1024);
565+
566+
let region = get_memory_region(&mut mem, 0, 2048).expect("memory read failed");
567+
check_mem!(mem, region, 2048);
568+
}
569+
570+
#[test]
571+
fn test_memread_overflow2() {
572+
// offset > mem size
573+
let mut mem = Memory::default();
574+
mem.grow(1024);
575+
assert_eq!(mem.len(), 1024);
576+
577+
let region = get_memory_region(&mut mem, 1056, 1024).expect("memory read failed");
578+
check_mem!(mem, region, 1024);
579+
}
580+
581+
#[test]
582+
fn test_memread_overflow3() {
583+
// offset+len > mem size
584+
let mut mem = Memory::default();
585+
mem.grow(1024);
586+
assert_eq!(mem.len(), 1024);
587+
588+
let region = get_memory_region(&mut mem, 988, 2048).expect("memory read failed");
589+
check_mem!(mem, region, 2048);
590+
}
591+
592+
#[test]
593+
fn test_memread_overflow_err() {
594+
let mut mem = Memory::default();
595+
596+
let result = get_memory_region(&mut mem, u32::MAX - 1, 10);
597+
assert!(result.is_err());
598+
assert_eq!(result.err().unwrap().exit_code(), crate::EVM_CONTRACT_ILLEGAL_MEMORY_ACCESS);
599+
}
496600
}

0 commit comments

Comments
 (0)