blob: 04d2e37c1f9d3a9560a228f527f60d89f6c278bd [file] [log] [blame]
#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... */
strncat(a+20, a, 21);
strncat(a, a+20, 21);
return 0;
}