1// SPDX-License-Identifier: GPL-2.0-only
2#include <stddef.h>
3#include <linux/bpf.h>
4#include <bpf/bpf_helpers.h>
5#include "bpf_misc.h"
6
7struct S {
8	int x;
9};
10
11struct C {
12	int x;
13	int y;
14};
15
16struct {
17	__uint(type, BPF_MAP_TYPE_ARRAY);
18	__uint(max_entries, 1);
19	__type(key, __u32);
20	__type(value, struct S);
21} map SEC(".maps");
22
23enum E {
24	E_ITEM
25};
26
27static int global_data_x = 100;
28static int volatile global_data_y = 500;
29
30__noinline int foo(const struct S *s)
31{
32	if (s)
33		return bpf_get_prandom_u32() < s->x;
34
35	return 0;
36}
37
38__noinline int bar(int *x)
39{
40	if (x)
41		*x &= bpf_get_prandom_u32();
42
43	return 0;
44}
45__noinline int baz(volatile int *x)
46{
47	if (x)
48		*x &= bpf_get_prandom_u32();
49
50	return 0;
51}
52
53__noinline int qux(enum E *e)
54{
55	if (e)
56		return *e;
57
58	return 0;
59}
60
61__noinline int quux(int (*arr)[10])
62{
63	if (arr)
64		return (*arr)[9];
65
66	return 0;
67}
68
69__noinline int quuz(int **p)
70{
71	if (p)
72		*p = NULL;
73
74	return 0;
75}
76
77SEC("cgroup_skb/ingress")
78__success
79int global_func9(struct __sk_buff *skb)
80{
81	int result = 0;
82
83	{
84		const struct S s = {.x = skb->len };
85
86		result |= foo(&s);
87	}
88
89	{
90		const __u32 key = 1;
91		const struct S *s = bpf_map_lookup_elem(&map, &key);
92
93		result |= foo(s);
94	}
95
96	{
97		const struct C c = {.x = skb->len, .y = skb->family };
98
99		result |= foo((const struct S *)&c);
100	}
101
102	{
103		result |= foo(NULL);
104	}
105
106	{
107		bar(&result);
108		bar(&global_data_x);
109	}
110
111	{
112		result |= baz(&global_data_y);
113	}
114
115	{
116		enum E e = E_ITEM;
117
118		result |= qux(&e);
119	}
120
121	{
122		int array[10] = {0};
123
124		result |= quux(&array);
125	}
126
127	{
128		int *p;
129
130		result |= quuz(&p);
131	}
132
133	return result ? 1 : 0;
134}
135