2008/11/9 Dominique Pelle <[EMAIL PROTECTED]>: > $ gcc -Wall -o test-memcpy-memmove test-memcpy-memmove.c > $ ./memcpy-memmove > testing descending memcpy() with overlapping mem...OK > testing ascending memcpy() with overlapping mem...FAIL > expected=[abcdeabcdeabcdepqrstuvwxyz] > actual =[abcdeabcdefghijpqrstuvwxyz] > testing descending memmove() with overlapping mem...OK > testing ascending memmove() with overlapping mem...OK
Oops, small mistake, which does not change the conclusion, output should have been: $ ./memcpy-memmove testing descending memcpy() with overlapping mem...OK testing ascending memcpy() with overlapping mem...FAIL expected=[abcdeabcdefghijpqrstuvwxyz] actual =[abcdeabcdeabcdepqrstuvwxyz] testing descending memmove() with overlapping mem...OK testing ascending memmove() with overlapping mem...OK -- Dominique --~--~---------~--~----~------------~-------~--~----~ You received this message from the "vim_dev" maillist. For more information, visit http://www.vim.org/maillist.php -~----------~----~----~----~------~----~------~--~---
/* * Test whether memcpy()/memmove() give the correct * results when moving overlapping memory upward or * backward. mempcy() is not guarantee to be correct * when memory overlaps, memmove() should be correct. * * Results on my system (Linux x86): * * $ gcc -O2 -Wall -o test-memcpy-memmove test-memcpy-memmove.c * $ ./test-memcpy-memmove * testing descending memcpy() with overlapping mem...OK * testing ascending memcpy() with overlapping mem...FAIL * expected=[abcdeabcdefghijpqrstuvwxyz] * actual =[abcdeabcdeabcdepqrstuvwxyz] * testing descending memmove() with overlapping mem...OK * testing ascending memmove() with overlapping mem...OK * * Dominique Pelle <[EMAIL PROTECTED]> */ #include <string.h> #include <stdio.h> #include <stdlib.h> /* Compare expected and actual results, and print outcome */ static void compare(const char *expected, const char *actual) { if (strcmp(expected, actual) == 0) { printf("OK\n"); } else { printf("FAIL\n" " expected=[%s]\n" " actual =[%s]\n", expected, actual); } } int main() { /* 0 1 2 * .........................01234567890123456789012345 */ const char *pristine_str = "abcdefghijklmnopqrstuvwxyz"; char *str; /* Expected results when copying 10 char by 5 positions (hence * overlapping memory). * * When copying downward memmove(str, str + 5, 10) * (.) for unchanged char (X) for changed char: * * pristine: abcdefghijklmnopqrstuvwxyx * XXXXXXXXXX................ */ const const char *expected1 = "fghijklmnoklmnopqrstuvwxyz"; /* * When copying upward memmove(str + 5, str, 10) * (.) for unchanged char (X) for changed char: * * pristine: abcdefghijklmnopqrstuvwxyx * .....XXXXXXXXXX........... */ const const char *expected2 = "abcdeabcdefghijpqrstuvwxyz"; printf("testing descending memcpy() with overlapping mem..."); str = strdup(pristine_str); memcpy(str, str + 5, 10); compare(expected1, str); printf("testing ascending memcpy() with overlapping mem..."); strcpy(str, pristine_str); memcpy(str + 5, str, 10); compare(expected2, str); printf("testing descending memmove() with overlapping mem..."); strcpy(str, pristine_str); memmove(str, str + 5, 10); compare(expected1, str); printf("testing ascending memmove() with overlapping mem..."); strcpy(str, pristine_str); memmove(str + 5, str, 10); compare(expected2, str); free(str); return 0; }