1 /* $NetBSD: msg_302.c,v 1.8 2023/07/07 19:45:22 rillig Exp $ */
2 # 3 "msg_302.c"
3
4 // Test for message: '%s' returns pointer to automatic object [302]
5
6 /* lint1-extra-flags: -X 351 */
7
8 void *
return_arg(int arg)9 return_arg(int arg)
10 {
11 /* expect+1: warning: 'return_arg' returns pointer to automatic object [302] */
12 return &arg;
13 }
14
15 void *
return_local(void)16 return_local(void)
17 {
18 int local = 3;
19 /* expect+1: warning: 'return_local' returns pointer to automatic object [302] */
20 return &local;
21 }
22
23 void *
return_local_array(int x)24 return_local_array(int x)
25 {
26 int local[5], *indirect = local;
27
28 switch (x) {
29 case 0:
30 /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */
31 return local;
32 case 1:
33 /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */
34 return &local[3];
35 case 2:
36 /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */
37 return 5 + local;
38 case 3:
39 /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */
40 return local + 5;
41 case 4:
42 /* XXX: lint only checks '+' but not '-'. */
43 return local - -3;
44 case 5:
45 /* XXX: lint doesn't track this indirection, but Clang-tidy does. */
46 return indirect;
47 case 6:
48 /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */
49 return (local);
50 case 7:
51 /* C99 6.5.2.5p6 */
52 /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */
53 return (char[]){"local string"};
54 default:
55 return "OK";
56 }
57 }
58
59 void *
return_static(void)60 return_static(void)
61 {
62 static int long_lived = 3;
63 return &long_lived;
64 }
65