Home | History | Annotate | Download | only in Sema
      1 // RUN: %clang_cc1 -Wstrlcpy-strlcat-size -verify -fsyntax-only %s
      2 
      3 typedef __SIZE_TYPE__ size_t;
      4 size_t strlcpy (char * restrict dst, const char * restrict src, size_t size);
      5 size_t strlcat (char * restrict dst, const char * restrict src, size_t size);
      6 size_t strlen (const char *s);
      7 
      8 char s1[100];
      9 char s2[200];
     10 char * s3;
     11 
     12 struct {
     13   char f1[100];
     14   char f2[100][3];
     15 } s4, **s5;
     16 
     17 int x;
     18 
     19 void f(void)
     20 {
     21   strlcpy(s1, s2, sizeof(s1)); // no warning
     22   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.
     31 struct S {
     32   int y;
     33   char x[];
     34 };
     35 
     36 void 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.
     42 void size_1() {
     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.
     50 void 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