| #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; |
| } |