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 
7 struct S {
8 	int x;
9 };
10 
11 struct C {
12 	int x;
13 	int y;
14 };
15 
16 struct {
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 
23 enum E {
24 	E_ITEM
25 };
26 
27 static int global_data_x = 100;
28 static 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 
77 SEC("cgroup_skb/ingress")
78 __success
79 int 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