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