According to man 3 memccpy
the memccpy
function is defined as follows:
SYNOPSIS
#include <string.h> void *memccpy(void *dest, const void *src, int c, size_t n);
DESCRIPTION
The
memccpy()
function copies no more thann
bytes from memory areasrc
to memory areadest
, stopping when the characterc
is found.If the memory areas overlap, the results are undefined.
What confuses me is that memccpy
copies n
bytes and stops if character c
is found. However, the function takes int c
as an argument. So what happens if I call memccpy
with the following value:
memccpy(&x, &y, 0xffffff76, 100);
Here the value to check is too big for char
. Should this case work?
memccpy()
is defined by POSIX.1-2001 (IEEE Std 1003.1-2001), which states:
SYNOPSIS
#include <string.h> void *memccpy(void *restrict s1, const void *restrict s2, int c, size_t n);
DESCRIPTION
The
memccpy()
function shall copy bytes from memory areas2
intos1
, stopping after the first occurrence of bytec
(converted to an unsigned char) is copied, or after n bytes are copied, whichever comes first. If copying takes place between objects that overlap, the behavior is undefined.
So there you go, a simple unsigned char
conversion takes place:
void *memccpy(void *restrict s1, const void *restrict s2, int c, size_t n) {
unsigned char actual_c = (unsigned char)c;
// ...
}
In fact, the most prominent C standard library implementations that I know do exactly this:
memchr
which does unsigned char c = (unsigned int)c_in;
unsigned char uc = c;
unsigned char uc = c;
c = (unsigned char)c;
(((unsigned char)(*r1++ = *r2++)) != ((unsigned char) c))