lib.rs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. //! Test mem functions
  2. pub trait MemOps {
  3. /// # Safety
  4. unsafe fn memcpy(&self, dst: &mut [u8], src: &[u8], n: usize);
  5. /// # Safety
  6. unsafe fn memmove(&self, dst: *mut u8, src: *mut u8, n: usize);
  7. /// # Safety
  8. unsafe fn memset(&self, s: &mut [u8], c: u8, n: usize);
  9. /// # Safety
  10. unsafe fn memcmp(&self, s1: &[u8], s2: &[u8], n: usize) -> i32;
  11. }
  12. pub fn run_mem_tests<T: MemOps>(mem_ops: T) {
  13. // memcpy
  14. unsafe {
  15. let src = &[1_u8; 18];
  16. let dst = &mut [0_u8; 1];
  17. mem_ops.memcpy(dst, src, 1);
  18. assert_eq!(&src[..1], dst);
  19. let dst = &mut [0_u8; 3];
  20. mem_ops.memcpy(dst, src, 3);
  21. assert_eq!(&src[..3], dst);
  22. let dst = &mut [0_u8; 8];
  23. mem_ops.memcpy(dst, src, 8);
  24. assert_eq!(&src[..8], dst);
  25. let dst = &mut [0_u8; 9];
  26. mem_ops.memcpy(dst, src, 9);
  27. assert_eq!(&src[..9], dst);
  28. let dst = &mut [0_u8; 16];
  29. mem_ops.memcpy(dst, src, 16);
  30. assert_eq!(&src[..16], dst);
  31. let dst = &mut [0_u8; 18];
  32. mem_ops.memcpy(dst, src, 18);
  33. assert_eq!(&src[..18], dst);
  34. let dst = &mut [0_u8; 18];
  35. mem_ops.memcpy(dst, &src[1..], 17);
  36. assert_eq!(&src[1..], &dst[..17]);
  37. let dst = &mut [0_u8; 18];
  38. mem_ops.memcpy(&mut dst[1..], &src[1..], 17);
  39. assert_eq!(&src[1..], &dst[1..]);
  40. }
  41. // memmove
  42. unsafe {
  43. let buf = &mut [1_u8, 0];
  44. mem_ops.memmove(&mut buf[0] as *mut u8, &mut buf[1] as *mut u8, 1);
  45. assert_eq!(buf[0], buf[1]);
  46. let buf = &mut [1_u8, 0];
  47. mem_ops.memmove(&mut buf[1] as *mut u8, &mut buf[0] as *mut u8, 1);
  48. assert_eq!(buf[0], buf[1]);
  49. let buf = &mut [1_u8, 1, 1, 0, 0, 0];
  50. mem_ops.memmove(&mut buf[0] as *mut u8, &mut buf[3] as *mut u8, 3);
  51. assert_eq!(buf[..3], buf[3..]);
  52. let buf = &mut [1_u8, 1, 1, 0, 0, 0];
  53. mem_ops.memmove(&mut buf[3] as *mut u8, &mut buf[0] as *mut u8, 3);
  54. assert_eq!(buf[..3], buf[3..]);
  55. let buf = &mut [1_u8, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0];
  56. mem_ops.memmove(&mut buf[0] as *mut u8, &mut buf[8] as *mut u8, 8);
  57. assert_eq!(buf[..8], buf[8..]);
  58. let buf = &mut [1_u8, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0];
  59. mem_ops.memmove(&mut buf[8] as *mut u8, &mut buf[0] as *mut u8, 8);
  60. assert_eq!(buf[..8], buf[8..]);
  61. let buf = &mut [1_u8, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0];
  62. mem_ops.memmove(&mut buf[0] as *mut u8, &mut buf[9] as *mut u8, 9);
  63. assert_eq!(buf[..9], buf[9..]);
  64. let buf = &mut [0_u8, 1, 2, 3, 4, 5, 6, 7, 8, 9];
  65. mem_ops.memmove(&mut buf[1] as *mut u8, &mut buf[0] as *mut u8, 9);
  66. assert_eq!(&mut [0_u8, 0, 1, 2, 3, 4, 5, 6, 7, 8], buf);
  67. let buf = &mut [1_u8, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0];
  68. mem_ops.memmove(&mut buf[9] as *mut u8, &mut buf[0] as *mut u8, 9);
  69. assert_eq!(buf[..9], buf[9..]);
  70. let buf = &mut [
  71. 1_u8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  72. 0, 0, 0, 0,
  73. ];
  74. mem_ops.memmove(&mut buf[0] as *mut u8, &mut buf[16] as *mut u8, 16);
  75. assert_eq!(buf[..16], buf[16..]);
  76. let buf = &mut [
  77. 1_u8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  78. 0, 0, 0, 0,
  79. ];
  80. mem_ops.memmove(&mut buf[16] as *mut u8, &mut buf[0] as *mut u8, 16);
  81. assert_eq!(buf[..16], buf[16..]);
  82. let buf = &mut [
  83. 1_u8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  84. 0, 0, 0, 0, 0, 0, 0, 0,
  85. ];
  86. mem_ops.memmove(&mut buf[0] as *mut u8, &mut buf[18] as *mut u8, 18);
  87. assert_eq!(buf[..18], buf[18..]);
  88. let buf = &mut [
  89. 1_u8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  90. 0, 0, 0, 0, 0, 0, 0, 0,
  91. ];
  92. mem_ops.memmove(&mut buf[18] as *mut u8, &mut buf[0] as *mut u8, 18);
  93. assert_eq!(buf[..18], buf[18..]);
  94. let buf = &mut [
  95. 1_u8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  96. 0, 0, 0, 0, 0, 0, 0, 0,
  97. ];
  98. mem_ops.memmove(&mut buf[1] as *mut u8, &mut buf[18] as *mut u8, 17);
  99. assert_eq!(buf[1..17], buf[18..34]);
  100. let buf = &mut [
  101. 1_u8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  102. 0, 0, 0, 0, 0, 0, 0, 0,
  103. ];
  104. mem_ops.memmove(&mut buf[19] as *mut u8, &mut buf[1] as *mut u8, 17);
  105. assert_eq!(buf[..17], buf[19..]);
  106. let buf = &mut [0_u8, 0, 0, 1, 1, 1, 1, 1, 0];
  107. mem_ops.memmove(&mut buf[0] as *mut u8, &mut buf[3] as *mut u8, 5);
  108. assert_eq!(buf, &mut [1, 1, 1, 1, 1, 1, 1, 1, 0]);
  109. }
  110. // memset
  111. unsafe {
  112. let exp = &[1_u8; 18];
  113. let buf = &mut [0_u8; 18];
  114. mem_ops.memset(&mut buf[0..], 1, 1);
  115. assert_eq!(exp[..1], buf[..1]);
  116. mem_ops.memset(&mut buf[0..], 1, 3);
  117. assert_eq!(exp[..3], buf[..3]);
  118. mem_ops.memset(&mut buf[0..], 1, 8);
  119. assert_eq!(exp[..8], buf[..8]);
  120. mem_ops.memset(&mut buf[0..], 1, 9);
  121. assert_eq!(exp[..9], buf[..9]);
  122. mem_ops.memset(&mut buf[0..], 1, 16);
  123. assert_eq!(exp[..16], buf[..16]);
  124. mem_ops.memset(&mut buf[0..], 1, 18);
  125. assert_eq!(exp[..18], buf[..18]);
  126. mem_ops.memset(&mut buf[1..], 1, 17);
  127. assert_eq!(exp[1..18], buf[1..18]);
  128. }
  129. // memcmp
  130. unsafe {
  131. assert_eq!(-1, mem_ops.memcmp(&[0_u8], &[1_u8], 1));
  132. assert_eq!(-1, mem_ops.memcmp(&[0_u8, 0, 0], &[0_u8, 0, 1], 3));
  133. assert_eq!(
  134. 0,
  135. mem_ops.memcmp(
  136. &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0],
  137. &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0],
  138. 9
  139. )
  140. );
  141. assert_eq!(
  142. -1,
  143. mem_ops.memcmp(
  144. &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0],
  145. &[0_u8, 0, 0, 0, 0, 0, 0, 0, 1],
  146. 9
  147. )
  148. );
  149. assert_eq!(
  150. -1,
  151. mem_ops.memcmp(
  152. &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  153. &[0_u8, 0, 0, 0, 0, 0, 0, 0, 0, 1],
  154. 10
  155. )
  156. );
  157. assert_eq!(0, mem_ops.memcmp(&[0_u8; 8], &[0_u8; 8], 8));
  158. assert_eq!(-1, mem_ops.memcmp(&[0_u8; 8], &[1_u8; 8], 8));
  159. assert_eq!(-1, mem_ops.memcmp(&[0_u8; 16], &[1_u8; 16], 16));
  160. assert_eq!(-1, mem_ops.memcmp(&[0_u8; 18], &[1_u8; 18], 18));
  161. let one = &[0_u8; 18];
  162. let two = &[1_u8; 18];
  163. assert_eq!(-1, mem_ops.memcmp(&one[1..], &two[0..], 17));
  164. assert_eq!(-1, mem_ops.memcmp(&one[1..], &two[1..], 17));
  165. }
  166. }