summaryrefslogtreecommitdiff
path: root/tests/usr.bin/xlint/lint1/msg_302.c
blob: b924ffcea440acc5b18f0c8233fd61fc297d9fef (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
/*	$NetBSD: msg_302.c,v 1.8 2023/07/07 19:45:22 rillig Exp $	*/
# 3 "msg_302.c"

// Test for message: '%s' returns pointer to automatic object [302]

/* lint1-extra-flags: -X 351 */

void *
return_arg(int arg)
{
	/* expect+1: warning: 'return_arg' returns pointer to automatic object [302] */
	return &arg;
}

void *
return_local(void)
{
	int local = 3;
	/* expect+1: warning: 'return_local' returns pointer to automatic object [302] */
	return &local;
}

void *
return_local_array(int x)
{
	int local[5], *indirect = local;

	switch (x) {
	case 0:
		/* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */
		return local;
	case 1:
		/* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */
		return &local[3];
	case 2:
		/* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */
		return 5 + local;
	case 3:
		/* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */
		return local + 5;
	case 4:
		/* XXX: lint only checks '+' but not '-'. */
		return local - -3;
	case 5:
		/* XXX: lint doesn't track this indirection, but Clang-tidy does. */
		return indirect;
	case 6:
		/* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */
		return (local);
	case 7:
		/* C99 6.5.2.5p6 */
		/* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */
		return (char[]){"local string"};
	default:
		return "OK";
	}
}

void *
return_static(void)
{
	static int long_lived = 3;
	return &long_lived;
}