2011-10-04 Greta Yorsh <Greta.Yorsh@arm.com>
* testsuite/newlib.string/memcpy-1.c: New test.
This commit is contained in:
		| @@ -1,3 +1,7 @@ | |||||||
|  | 2011-10-04  Greta Yorsh  <Greta.Yorsh@arm.com> | ||||||
|  |  | ||||||
|  | 	* testsuite/newlib.string/memcpy-1.c: New test. | ||||||
|  |  | ||||||
| 2011-10-04  Nick Clifton  <nickc@redhat.com> | 2011-10-04  Nick Clifton  <nickc@redhat.com> | ||||||
|  |  | ||||||
| 	* libc/machine/arm/memcpy.S: Fix unaligned access copying. | 	* libc/machine/arm/memcpy.S: Fix unaligned access copying. | ||||||
|   | |||||||
							
								
								
									
										160
									
								
								newlib/testsuite/newlib.string/memcpy-1.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								newlib/testsuite/newlib.string/memcpy-1.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,160 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (c) 2011 ARM Ltd | ||||||
|  |  * All rights reserved. | ||||||
|  |  * | ||||||
|  |  * Redistribution and use in source and binary forms, with or without | ||||||
|  |  * modification, are permitted provided that the following conditions | ||||||
|  |  * are met: | ||||||
|  |  * 1. Redistributions of source code must retain the above copyright | ||||||
|  |  *    notice, this list of conditions and the following disclaimer. | ||||||
|  |  * 2. Redistributions in binary form must reproduce the above copyright | ||||||
|  |  *    notice, this list of conditions and the following disclaimer in the | ||||||
|  |  *    documentation and/or other materials provided with the distribution. | ||||||
|  |  * 3. The name of the company may not be used to endorse or promote | ||||||
|  |  *    products derived from this software without specific prior written | ||||||
|  |  *    permission. | ||||||
|  |  * | ||||||
|  |  * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||||||
|  |  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||||||
|  |  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | ||||||
|  |  * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  |  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED | ||||||
|  |  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | ||||||
|  |  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | ||||||
|  |  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | ||||||
|  |  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||||||
|  |  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <string.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdarg.h> | ||||||
|  |  | ||||||
|  | #ifndef BUFF_SIZE | ||||||
|  | #define BUFF_SIZE 1024 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef START_COPY | ||||||
|  | #define START_COPY 256 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef MAX_BLOCK_SIZE | ||||||
|  | #define MAX_BLOCK_SIZE 128 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef MAX_OFFSET | ||||||
|  | #define MAX_OFFSET 3 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if (START_COPY + MAX_OFFSET + MAX_BLOCK_SIZE >= BUFF_SIZE) | ||||||
|  | #error "Buffer overrun: START_COPY + MAX_OFFSET + MAX_BLOCK_SIZE >= BUFF_SIZE." | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define TOO_MANY_ERRORS 11 | ||||||
|  | int errors = 0; | ||||||
|  |  | ||||||
|  | void | ||||||
|  | print_error (char const* msg, ...) | ||||||
|  | {    | ||||||
|  |   errors++; | ||||||
|  |   if (errors == TOO_MANY_ERRORS) | ||||||
|  |     { | ||||||
|  |       fprintf (stderr, "Too many errors.\n"); | ||||||
|  |     } | ||||||
|  |   else if (errors < TOO_MANY_ERRORS) | ||||||
|  |     { | ||||||
|  |       va_list ap; | ||||||
|  |       va_start (ap, msg); | ||||||
|  |       vfprintf (stderr, msg, ap); | ||||||
|  |       va_end (ap); | ||||||
|  |     } | ||||||
|  |   else | ||||||
|  |     { | ||||||
|  |       /* Further errors omitted.  */ | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int | ||||||
|  | main (void) | ||||||
|  | { | ||||||
|  |   /* Allocate buffers to read and write from.  */ | ||||||
|  |   char src[BUFF_SIZE], dest[BUFF_SIZE], backup_src[BUFF_SIZE]; | ||||||
|  |  | ||||||
|  |   /* Fill the source buffer with non-null values, reproducable random data.  */ | ||||||
|  |   srand (1539); | ||||||
|  |   int i, j; | ||||||
|  |   unsigned sa; | ||||||
|  |   unsigned da; | ||||||
|  |   unsigned n; | ||||||
|  |   for (i = 0; i < BUFF_SIZE; i++) | ||||||
|  |     { | ||||||
|  |       src[i] = (char)rand () | 1; | ||||||
|  |       backup_src[i] = src[i]; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |   /* Make calls to memcpy with block sizes ranging between 1 and | ||||||
|  |      MAX_BLOCK_SIZE bytes, aligned and misaligned source and destination.  */ | ||||||
|  |   for (sa = 0; sa <= MAX_OFFSET; sa++) | ||||||
|  |     for (da = 0; da <= MAX_OFFSET; da++) | ||||||
|  |       for (n = 1; n <= MAX_BLOCK_SIZE; n++) | ||||||
|  |         { | ||||||
|  |           printf ("."); | ||||||
|  |           /* Zero dest so we can check it properly after the copying.  */ | ||||||
|  |           for (j = 0; j < BUFF_SIZE; j++) | ||||||
|  |             dest[j] = 0; | ||||||
|  |            | ||||||
|  |           void *ret = memcpy (dest + START_COPY + da, src + sa, n); | ||||||
|  |            | ||||||
|  |           /* Check return value.  */ | ||||||
|  |           if (ret != (dest + START_COPY + da)) | ||||||
|  |             print_error ("\nFailed: wrong return value in memcpy of %u bytes " | ||||||
|  |                          "with src_align %u and dst_align %u. " | ||||||
|  |                          "Return value and dest should be the same" | ||||||
|  |                          "(ret is %p, dest is %p)\n", | ||||||
|  |                          n, sa, da, ret, dest + START_COPY + da); | ||||||
|  |            | ||||||
|  |           /* Check that content of the destination buffer | ||||||
|  |              is the same as the source buffer, and | ||||||
|  |              memory outside destination buffer is not modified.  */ | ||||||
|  |           for (j = 0; j < BUFF_SIZE; j++) | ||||||
|  |             if (j < START_COPY + da) | ||||||
|  |               { | ||||||
|  |                 if (dest[j] != 0) | ||||||
|  |                   print_error ("\nFailed: after memcpy of %u bytes " | ||||||
|  |                                "with src_align %u and dst_align %u, " | ||||||
|  |                                "byte %u before the start of dest is not 0.\n", | ||||||
|  |                                n, sa, da, START_COPY - j); | ||||||
|  |               } | ||||||
|  |             else if (j < START_COPY + da + n) | ||||||
|  |               { | ||||||
|  |                 i = j - START_COPY - da; | ||||||
|  |                 if (dest[j] != (src + sa)[i]) | ||||||
|  |                   print_error ("\nFailed: after memcpy of %u bytes " | ||||||
|  |                                "with src_align %u and dst_align %u, " | ||||||
|  |                                "byte %u in dest and src are not the same.\n", | ||||||
|  |                                n, sa, da, i); | ||||||
|  |               } | ||||||
|  |             else if (dest[j] != 0) | ||||||
|  |               { | ||||||
|  |                 print_error ("\nFailed: after memcpy of %u bytes " | ||||||
|  |                              "with src_align %u and dst_align %u, " | ||||||
|  |                              "byte %u after the end of dest is not 0.\n", | ||||||
|  |                              n, sa, da, j - START_COPY - da - n); | ||||||
|  |               } | ||||||
|  |  | ||||||
|  |           /* Check src is not modified.  */ | ||||||
|  |           for (j = 0; j < BUFF_SIZE; j++) | ||||||
|  |             if (src[i] != backup_src[i]) | ||||||
|  |               print_error ("\nFailed: after memcpy of %u bytes " | ||||||
|  |                            "with src_align %u and dst_align %u, " | ||||||
|  |                            "byte %u of src is modified.\n", | ||||||
|  |                            n, sa, da, j); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |   printf ("\n"); | ||||||
|  |   if (errors != 0) | ||||||
|  |     abort (); | ||||||
|  |  | ||||||
|  |   exit (0); | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user