On Tuesday, 31 January 2017 at 23:30:04 UTC, Walter Bright wrote:
On 1/31/2017 3:00 PM, Richard Delorme wrote:
The thing about memcpy is compilers build in a LOT of information about it that simply is not there in the declaration. I suggest retrying your example for gcc/clang, but use your own memcpy, i.e.:

void* mymemcpy(void * restrict s1, const void * restrict s2, size_t n);

Let us know what the results are!

//-----8<-------------------------------------------------------
#include <string.h>
#include <stdio.h>

void* mymemcpy(void* restrict dest, const void* restrict src, size_t n) {
        const char *s = src;
        char *d = dest;
        for (size_t i = 0; i < n; ++i) d[i] = s[i];
        return d;
}

void *copy(const void *c, size_t n) {
        char d[16];
        return mymemcpy(d, c, n);
}       

int main(void) {
char a[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
        char *b = copy(a, 8);

        for (int i = 0; i < 16; ++i) printf("%d ", b[i]);
        putchar('\n');
}
//-----8<-------------------------------------------------------
$ gcc mymemcpy.c -O2 -W
mymemcpy.c: In function 'copy':
mymemcpy.c:13:9: warning: function returns address of local variable [-Wreturn-local-addr]
  return mymemcpy(d, c, n);
         ^~~~~~~~~~~~~~~~~
memcpy4.c:12:7: note: declared here
  char d[16];

clang (version 3.8.1) failed to find error in this code.


Reply via email to