@@ -479,6 +479,7 @@ mod tests {
479
479
assert_eq!( m. state. stack. pop( ) . unwrap( ) , U256 :: from( 64 ) ) ;
480
480
} ;
481
481
}
482
+
482
483
#[ test]
483
484
fn test_msize_basic ( ) {
484
485
// Demonstrate that MSIZE depends on memory.len()
@@ -493,4 +494,107 @@ mod tests {
493
494
assert_eq!( m. state. stack. pop( ) . unwrap( ) , U256 :: from( 32 ) ) ;
494
495
} ;
495
496
}
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
+ }
496
600
}
0 commit comments