/* Tests for some interesting cases in non-standard strlcpy(). */ #include <stdio.h> #include <stdlib.h> #include <strings.h> int main(void) { size_t copied; char *src = malloc(100); if (src == NULL) { fprintf(stderr, "Memory allocation failure.\n"); return 1; } strcpy(src, "Hey, dude!"); char *dst = malloc(10); if (dst == NULL) { fprintf(stderr, "Memory allocation failure.\n"); return 1; } /* This is ok. */ copied = strlcpy(dst, src, 10); if (copied != 10) fprintf(stderr, "Expected 10 but got %zu for test #1.\n", copied); /* Here dst is not large enough. */ copied = strlcpy(dst, src, strlen(src) + 1); if (copied != 10) fprintf(stderr, "Expected 10 but got %zu for test #2.\n", copied); /* This is just a fancy way how to write strlen(src). Undocumented but heavily used. */ copied = strlcpy(NULL, src, 0); if (copied != 10) fprintf(stderr, "Expected 10 but got %zu for test #3.\n", copied); /* Source and destination overlap. */ strlcpy(src + 9, src, strlen(src) + 1); /* Return value is not checked because function behaviour is undefined in such case (and valgrind's differs). */ return 0; }