56 lines · c
1// RUN: %clang_cc1 -Wstrlcpy-strlcat-size -verify -fsyntax-only %s2 3typedef __SIZE_TYPE__ size_t;4size_t strlcpy (char * restrict dst, const char * restrict src, size_t size);5size_t strlcat (char * restrict dst, const char * restrict src, size_t size);6size_t strlen (const char *s);7 8char s1[100];9char s2[200];10char * s3;11 12struct {13 char f1[100];14 char f2[100][3];15} s4, **s5;16 17int x;18 19void f(void)20{21 strlcpy(s1, s2, sizeof(s1)); // no warning22 strlcpy(s1, s2, sizeof(s2)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} expected-note {{change size argument to be the size of the destination}}23 strlcpy(s1, s3, strlen(s3)+1); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} expected-note {{change size argument to be the size of the destination}}24 strlcat(s2, s3, sizeof(s3)); // expected-warning {{size argument in 'strlcat' call appears to be size of the source; expected the size of the destination}} expected-note {{change size argument to be the size of the destination}}25 strlcpy(s4.f1, s2, sizeof(s2)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} expected-note {{change size argument to be the size of the destination}}26 strlcpy((*s5)->f2[x], s2, sizeof(s2)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} expected-note {{change size argument to be the size of the destination}}27 strlcpy(s1+3, s2, sizeof(s2)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}}28}29 30// Don't issue FIXIT for flexible arrays.31struct S {32 int y; 33 char x[];34};35 36void flexible_arrays(struct S *s) {37 char str[] = "hi";38 strlcpy(s->x, str, sizeof(str)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}}39}40 41// Don't issue FIXIT for destinations of size 1.42void size_1(void) {43 char z[1];44 char str[] = "hi";45 46 strlcpy(z, str, sizeof(str)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}}47}48 49// Support VLAs.50void vlas(int size) {51 char z[size];52 char str[] = "hi";53 54 strlcpy(z, str, sizeof(str)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} expected-note {{change size argument to be the size of the destination}}55}56