Skip to content

Commit 3b050d2

Browse files
committed
Add test cases for memcpy, memmove and memset for different alignment
1 parent e6fd1b2 commit 3b050d2

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed

testcrate/tests/mem.rs

+127
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
extern crate compiler_builtins;
22
use compiler_builtins::mem::{memcmp, memcpy, memmove, memset};
33

4+
const WORD_SIZE: usize = core::mem::size_of::<usize>();
5+
46
#[test]
57
fn memcpy_3() {
68
let mut arr: [u8; 12] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
@@ -131,3 +133,128 @@ fn memcmp_ne() {
131133
assert!(memcmp(arr2.as_ptr(), arr1.as_ptr(), 8) > 0);
132134
}
133135
}
136+
137+
#[derive(Clone, Copy)]
138+
struct AlignedStorage<const N: usize>([u8; N], [usize; 0]);
139+
140+
fn gen_arr<const N: usize>() -> AlignedStorage<N> {
141+
let mut ret = AlignedStorage::<N>([0; N], []);
142+
for i in 0..N {
143+
ret.0[i] = i as u8;
144+
}
145+
ret
146+
}
147+
148+
#[test]
149+
fn memmove_forward_misaligned_nonaligned_start() {
150+
let mut arr = gen_arr::<32>();
151+
let mut reference = arr;
152+
unsafe {
153+
let src = arr.0.as_ptr().offset(6);
154+
let dst = arr.0.as_mut_ptr().offset(3);
155+
assert_eq!(memmove(dst, src, 17), dst);
156+
reference.0.copy_within(6..6+17, 3);
157+
assert_eq!(arr.0, reference.0);
158+
}
159+
}
160+
161+
#[test]
162+
fn memmove_forward_misaligned_aligned_start() {
163+
let mut arr = gen_arr::<32>();
164+
let mut reference = arr;
165+
unsafe {
166+
let src = arr.0.as_ptr().offset(6);
167+
let dst = arr.0.as_mut_ptr().add(0);
168+
assert_eq!(memmove(dst, src, 17), dst);
169+
reference.0.copy_within(6..6+17, 0);
170+
assert_eq!(arr.0, reference.0);
171+
}
172+
}
173+
174+
#[test]
175+
fn memmove_forward_aligned() {
176+
let mut arr = gen_arr::<32>();
177+
let mut reference = arr;
178+
unsafe {
179+
let src = arr.0.as_ptr().add(3+WORD_SIZE);
180+
let dst = arr.0.as_mut_ptr().add(3);
181+
assert_eq!(memmove(dst, src, 17), dst);
182+
reference.0.copy_within(3+WORD_SIZE..3+WORD_SIZE+17, 3);
183+
assert_eq!(arr.0, reference.0);
184+
}
185+
}
186+
187+
#[test]
188+
fn memmove_backward_misaligned_nonaligned_start() {
189+
let mut arr = gen_arr::<32>();
190+
let mut reference = arr;
191+
unsafe {
192+
let src = arr.0.as_ptr().offset(3);
193+
let dst = arr.0.as_mut_ptr().offset(6);
194+
assert_eq!(memmove(dst, src, 17), dst);
195+
reference.0.copy_within(3..3+17, 6);
196+
assert_eq!(arr.0, reference.0);
197+
}
198+
}
199+
200+
#[test]
201+
fn memmove_backward_misaligned_aligned_start() {
202+
let mut arr = gen_arr::<32>();
203+
let mut reference = arr;
204+
unsafe {
205+
let src = arr.0.as_ptr().offset(3);
206+
let dst = arr.0.as_mut_ptr().add(WORD_SIZE);
207+
assert_eq!(memmove(dst, src, 17), dst);
208+
reference.0.copy_within(3..3+17, WORD_SIZE);
209+
assert_eq!(arr.0, reference.0);
210+
}
211+
}
212+
213+
#[test]
214+
fn memmove_backward_aligned() {
215+
let mut arr = gen_arr::<32>();
216+
let mut reference = arr;
217+
unsafe {
218+
let src = arr.0.as_ptr().add(3);
219+
let dst = arr.0.as_mut_ptr().add(3+WORD_SIZE);
220+
assert_eq!(memmove(dst, src, 17), dst);
221+
reference.0.copy_within(3..3+17, 3+WORD_SIZE);
222+
assert_eq!(arr.0, reference.0);
223+
}
224+
}
225+
226+
#[test]
227+
fn memset_backward_misaligned_nonaligned_start() {
228+
let mut arr = gen_arr::<32>();
229+
let mut reference = arr;
230+
unsafe {
231+
let ptr = arr.0.as_mut_ptr().offset(6);
232+
assert_eq!(memset(ptr, 0xCC, 17), ptr);
233+
core::ptr::write_bytes(reference.0.as_mut_ptr().add(6), 0xCC, 17);
234+
assert_eq!(arr.0, reference.0);
235+
}
236+
}
237+
238+
#[test]
239+
fn memset_backward_misaligned_aligned_start() {
240+
let mut arr = gen_arr::<32>();
241+
let mut reference = arr;
242+
unsafe {
243+
let ptr = arr.0.as_mut_ptr().add(WORD_SIZE);
244+
assert_eq!(memset(ptr, 0xCC, 17), ptr);
245+
core::ptr::write_bytes(reference.0.as_mut_ptr().add(WORD_SIZE), 0xCC, 17);
246+
assert_eq!(arr.0, reference.0);
247+
}
248+
}
249+
250+
#[test]
251+
fn memset_backward_aligned() {
252+
let mut arr = gen_arr::<32>();
253+
let mut reference = arr;
254+
unsafe {
255+
let ptr = arr.0.as_mut_ptr().add(3+WORD_SIZE);
256+
assert_eq!(memset(ptr, 0xCC, 17), ptr);
257+
core::ptr::write_bytes(reference.0.as_mut_ptr().add(3+WORD_SIZE), 0xCC, 17);
258+
assert_eq!(arr.0, reference.0);
259+
}
260+
}

0 commit comments

Comments
 (0)