mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-10 01:16:12 +00:00
126 lines
2.3 KiB
C
126 lines
2.3 KiB
C
#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;
|
|
}
|