@@ -302,6 +302,83 @@ fn test_posix_mkstemp() {
302
302
}
303
303
}
304
304
305
+ fn test_memcpy ( ) {
306
+ unsafe {
307
+ let src = [ 1i8 , 2 , 3 ] ;
308
+ let dest = libc:: calloc ( 3 , 1 ) ;
309
+ libc:: memcpy ( dest, src. as_ptr ( ) as * const libc:: c_void , 3 ) ;
310
+ let slc = std:: slice:: from_raw_parts ( dest as * const i8 , 3 ) ;
311
+ assert_eq ! ( * slc, [ 1i8 , 2 , 3 ] ) ;
312
+ libc:: free ( dest) ;
313
+ }
314
+
315
+ unsafe {
316
+ let src = [ 1i8 , 2 , 3 ] ;
317
+ let dest = libc:: calloc ( 4 , 1 ) ;
318
+ libc:: memcpy ( dest, src. as_ptr ( ) as * const libc:: c_void , 3 ) ;
319
+ let slc = std:: slice:: from_raw_parts ( dest as * const i8 , 4 ) ;
320
+ assert_eq ! ( * slc, [ 1i8 , 2 , 3 , 0 ] ) ;
321
+ libc:: free ( dest) ;
322
+ }
323
+
324
+ unsafe {
325
+ let src = 123_i32 ;
326
+ let mut dest = 0_i32 ;
327
+ libc:: memcpy (
328
+ & mut dest as * mut i32 as * mut libc:: c_void ,
329
+ & src as * const i32 as * const libc:: c_void ,
330
+ std:: mem:: size_of :: < i32 > ( ) ,
331
+ ) ;
332
+ assert_eq ! ( dest, src) ;
333
+ }
334
+
335
+ unsafe {
336
+ let src = Some ( 123 ) ;
337
+ let mut dest: Option < i32 > = None ;
338
+ libc:: memcpy (
339
+ & mut dest as * mut Option < i32 > as * mut libc:: c_void ,
340
+ & src as * const Option < i32 > as * const libc:: c_void ,
341
+ std:: mem:: size_of :: < Option < i32 > > ( ) ,
342
+ ) ;
343
+ assert_eq ! ( dest, src) ;
344
+ }
345
+
346
+ unsafe {
347
+ let src = & 123 ;
348
+ let mut dest = & 42 ;
349
+ libc:: memcpy (
350
+ & mut dest as * mut & ' static i32 as * mut libc:: c_void ,
351
+ & src as * const & ' static i32 as * const libc:: c_void ,
352
+ std:: mem:: size_of :: < & ' static i32 > ( ) ,
353
+ ) ;
354
+ assert_eq ! ( * dest, 123 ) ;
355
+ }
356
+ }
357
+
358
+ fn test_strcpy ( ) {
359
+ use std:: ffi:: { CStr , CString } ;
360
+
361
+ // case: src_size equals dest_size
362
+ unsafe {
363
+ let src = CString :: new ( "rust" ) . unwrap ( ) ;
364
+ let size = src. as_bytes_with_nul ( ) . len ( ) ;
365
+ let dest = libc:: malloc ( size) ;
366
+ libc:: strcpy ( dest as * mut libc:: c_char , src. as_ptr ( ) ) ;
367
+ assert_eq ! ( CStr :: from_ptr( dest as * const libc:: c_char) , src. as_ref( ) ) ;
368
+ libc:: free ( dest) ;
369
+ }
370
+
371
+ // case: src_size is less than dest_size
372
+ unsafe {
373
+ let src = CString :: new ( "rust" ) . unwrap ( ) ;
374
+ let size = src. as_bytes_with_nul ( ) . len ( ) ;
375
+ let dest = libc:: malloc ( size + 1 ) ;
376
+ libc:: strcpy ( dest as * mut libc:: c_char , src. as_ptr ( ) ) ;
377
+ assert_eq ! ( CStr :: from_ptr( dest as * const libc:: c_char) , src. as_ref( ) ) ;
378
+ libc:: free ( dest) ;
379
+ }
380
+ }
381
+
305
382
#[ cfg( target_os = "linux" ) ]
306
383
fn test_sigrt ( ) {
307
384
let min = libc:: SIGRTMIN ( ) ;
@@ -333,6 +410,9 @@ fn main() {
333
410
test_isatty ( ) ;
334
411
test_clocks ( ) ;
335
412
413
+ test_memcpy ( ) ;
414
+ test_strcpy ( ) ;
415
+
336
416
#[ cfg( target_os = "linux" ) ]
337
417
{
338
418
test_posix_fadvise ( ) ;
0 commit comments