#include <string.h>
#include <stdio.h>
char b[50];
void reset_b(void)
{
int i;
for (i = 0; i < 50; i++)
b[i] = '_';
b[49] = '\0';
}
void reset_b2(void)
{
reset_b();
strcpy(b, "ABCDEFG");
}
int main(void)
{
char x[100];
char a[] = "abcdefghijklmnopqrstuvwxyz";
int i;
/* testing memcpy/strcpy overlap */
for (i = 0; i < 50; i++) {
x[i] = i+1; // don't put any zeroes in there
}
for (i = 50; i < 100; i++) {
// because of the errors, the strcpy's will overrun, so put some
// zeroes in the second half to stop them eventually
x[i] = 0;
}
memcpy(x+20, x, 20); // ok
memcpy(x+20, x, 21); // overlap
memcpy(x, x+20, 20); // ok
memcpy(x, x+20, 21); // overlap
strncpy(x+20, x, 20); // ok
strncpy(x+20, x, 21); // overlap
strncpy(x, x+20, 20); // ok
strncpy(x, x+20, 21); // overlap
x[39] = '\0';
strcpy(x, x+20); // ok
x[39] = 39;
x[40] = '\0';
strcpy(x, x+20); // overlap
x[19] = '\0';
strcpy(x+20, x); // ok
/*
x[19] = 19;
x[20] = '\0';
strcpy(x+20, x); // overlap, but runs forever (or until it seg faults)
*/
/* testing strcpy, strncpy() */
reset_b();
printf("`%s'\n", b);
strcpy(b, a);
printf("`%s'\n", b);
reset_b();
strncpy(b, a, 25);
printf("`%s'\n", b);
reset_b();
strncpy(b, a, 26);
printf("`%s'\n", b);
reset_b();
strncpy(b, a, 27);
printf("`%s'\n", b);
printf("\n");
/* testing strncat() */
reset_b2();
printf("`%s'\n", b);
reset_b2();
strcat(b, a);
printf("`%s'\n", b);
reset_b2();
strncat(b, a, 25);
printf("`%s'\n", b);
reset_b2();
strncat(b, a, 26);
printf("`%s'\n", b);
reset_b2();
strncat(b, a, 27);
printf("`%s'\n", b);
/* Nb: can't actually get strcat warning -- if any overlap occurs, it will
always run forever, I think... */
for ( i = 0; i < 2; i++)
strncat(a+20, a, 21); // run twice to check 2nd error isn't shown
strncat(a, a+20, 21);
/* This is ok, but once gave a warning when strncpy() was wrong,
and used 'n' for the length, even when the src was shorter than 'n' */
{
char dest[64];
char src [16];
strcpy( src, "short" );
strncpy( dest, src, 20 );
}
return 0;
}