aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/c-c++-common/Wstringop-truncation-4.c
blob: 6ed6a28a7af2c5dfb6cc68ddd0aab61afe3dcd7e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/* PR middle-end/84725 - enable attribute nonstring for all narrow character
   types
   Verify that -Wstringop-truncation is issued for uses of arrays and
   pointers to qualified forms of characters of all three types.
   { dg-do compile }
   { dg-options "-O2 -Wall -Wstringop-truncation -fno-ipa-icf" } */

#if __cplusplus
extern "C"
#endif
char* strncpy (char*, const char*, __SIZE_TYPE__);

#define S "1234"

struct Arrays
{
  char a[4];
  signed char b[4];
  unsigned char c[4];
};

void test_arrays (struct Arrays *p, const char *s)
{
  /* Expect accesses to all three arrays to trigger the warning,
     including the trailing one.  The size argument is a good
     enough indication that it is not being used as a "legacy"
     flexible array member.  */
  strncpy (p->a, s, sizeof p->a);           /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->b, s, sizeof p->b);    /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->c, s, sizeof p->c);    /* { dg-warning "\\\[-Wstringop-truncation" } */
}

struct Pointers
{
  char *p;
  signed char *q;
  unsigned char *r;
};

void test_pointers (struct Pointers *p)
{
  strncpy (p->p, S, sizeof S - 1);          /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->q, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->r, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
}

struct ConstArrays
{
  const char a[4];
  const signed char b[4];
  const unsigned char c[4];
};

void test_const_arrays (struct ConstArrays *p, const char *s)
{
  /* Expect accesses to all three arrays to trigger the warning,
     including the trailing one.  */
  strncpy ((char*)p->a, s, sizeof p->a);    /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->b, s, sizeof p->b);    /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->c, s, sizeof p->c);    /* { dg-warning "\\\[-Wstringop-truncation" } */
}

struct ConstPointers
{
  const char *p;
  const signed char *q;
  const unsigned char *r;
};

void test_const_pointers (struct ConstPointers *p)
{
  strncpy ((char*)p->p, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->q, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->r, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
}

struct VolatileArrays
{
  volatile char a[4];
  volatile signed char b[4];
  volatile unsigned char c[4];
};

void test_volatile_arrays (struct VolatileArrays *p, const char *s)
{
  /* Expect accesses to all three arrays to trigger the warning,
     including the trailing one.  */
  strncpy ((char*)p->a, s, sizeof p->a);    /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->b, s, sizeof p->b);    /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->c, s, sizeof p->c);    /* { dg-warning "\\\[-Wstringop-truncation" } */
}

struct VolatilePointers
{
  volatile char *p;
  volatile signed char *q;
  volatile unsigned char *r;
};

void test_volatile_pointers (struct VolatilePointers *p)
{
  strncpy ((char*)p->p, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->q, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->r, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
}

struct ConstVolatileArrays
{
  const volatile char a[4];
  const volatile signed char b[4];
  const volatile unsigned char c[4];
};

void test_const_volatile_arrays (struct ConstVolatileArrays *p, const char *s)
{
  /* Expect accesses to all three arrays to trigger the warning,
     including the trailing one.  */
  strncpy ((char*)p->a, s, sizeof p->a);    /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->b, s, sizeof p->b);    /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->c, s, sizeof p->c);    /* { dg-warning "\\\[-Wstringop-truncation" } */
}

struct ConstVolatilePointers
{
  const volatile char *p;
  const volatile signed char *q;
  const volatile unsigned char *r;
};

void test_const_volatile_pointers (struct ConstVolatilePointers *p)
{
  strncpy ((char*)p->p, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->q, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
  strncpy ((char*)p->r, S, sizeof S - 1);   /* { dg-warning "\\\[-Wstringop-truncation" } */
}

/* { dg-prune-output "-Wdiscarded-qualifiers" } */