• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Alan-Jowett / ebpf-verifier / 22075299923

16 Feb 2026 04:55PM UTC coverage: 87.121% (+0.8%) from 86.313%
22075299923

push

github

web-flow
Replace Number backend: boost's cpp_int → __int128 (#1007)

Backport the i128 representation from the Rust port. Number is an
intermediate representation for eBPF verification where all inputs
and outputs are ≤64-bit; i128 provides headroom for widening
arithmetic without the overhead of arbitrary-precision integers.

This commit has been verified to produce the same invariants as its parent on the test data.

Key changes to src/arith/num_big.hpp:
- Use __int128 on GCC/Clang, boost::multiprecision::int128_t on MSVC
- All arithmetic operators use checked helpers (__builtin_*_overflow
  on GCC/Clang, manual pre-checks on MSVC) to prevent signed overflow UB
- Simplify sign_extend/zero_extend: direct bit arithmetic replaces
  template dispatch over fixed widths
- fill_ones computed in unsigned space to avoid shift UB
- Custom decimal parser accumulates in UInt128 to handle kInt128Min
- Width assertions tightened to eBPF domain bounds (≤64/65)
 Consequential simplifications:
- Weight = Number (was already the case), so convert_NtoW_overflow
  was a passthrough returning false — inlined at all ~18 call sites
  in zone_domain.cpp, removing dead overflow branches
- eval_expression_overflow → eval_expression, returns Weight directly
- Remove dead SafeI64 overload and num_safeint.hpp include
- Custom int128_to_string in printing.cpp (no std::to_string for __int128)
- Add missing transitive includes (<algorithm>, <cassert>) previously
  provided by boost headers

Also: remove unused stats infrastructure, rename_classes.py, and
miscellaneous cleanup (docs ASCII arrows, splitdbm simplifications).

Signed-off-by: Elazar Gershuni <elazarg@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

139 of 166 new or added lines in 5 files covered. (83.73%)

52 existing lines in 4 files now uncovered.

9389 of 10777 relevant lines covered (87.12%)

3125310.38 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

99.77
/src/test/test_verify.cpp
1
// Copyright (c) Prevail Verifier contributors.
2
// SPDX-License-Identifier: MIT
3
#include <catch2/catch_all.hpp>
4
#include <thread>
5

6
#include "ebpf_verifier.hpp"
7
#include "linux/gpl/spec_type_descriptors.hpp"
8

9
using namespace prevail;
10

11
#define FAIL_LOAD_ELF(dirname, filename, sectionname)                                                    \
12
    TEST_CASE("Try loading nonexisting program: " dirname "/" filename, "[elf]") {                       \
13
        try {                                                                                            \
14
            thread_local_options = {};                                                                   \
15
            read_elf("ebpf-samples/" dirname "/" filename, sectionname, "", {}, &g_ebpf_platform_linux); \
16
            REQUIRE(false);                                                                              \
17
        } catch (const std::runtime_error&) {                                                            \
18
        }                                                                                                \
19
    }
20

21
// Some intentional failures
22
FAIL_LOAD_ELF("cilium", "not-found.o", "2/1")
11✔
23
FAIL_LOAD_ELF("cilium", "bpf_lxc.o", "not-found")
11✔
24
FAIL_LOAD_ELF("build", "badrelo.o", ".text")
11✔
25
FAIL_LOAD_ELF("invalid", "badsymsize.o", "xdp_redirect_map")
11✔
26

27
#define FAIL_UNMARSHAL(dirname, filename, sectionname)                                                                \
28
    TEST_CASE("Try unmarshalling bad program: " dirname "/" filename " " sectionname, "[unmarshal]") {                \
29
        thread_local_options = {};                                                                                    \
30
        auto raw_progs = read_elf("ebpf-samples/" dirname "/" filename, sectionname, "", {}, &g_ebpf_platform_linux); \
31
        REQUIRE(raw_progs.size() == 1);                                                                               \
32
        const RawProgram& raw_prog = raw_progs.back();                                                                \
33
        std::variant<InstructionSeq, std::string> prog_or_error = unmarshal(raw_prog, thread_local_options);          \
34
        REQUIRE(std::holds_alternative<std::string>(prog_or_error));                                                  \
35
    }
36

37
// Some intentional unmarshal failures
38
FAIL_UNMARSHAL("invalid", "invalid-lddw.o", ".text")
13✔
39

40
TEST_CASE("unsupported forms are rejected after unmarshal", "[unmarshal]") {
10✔
41
    constexpr EbpfInst exit{.opcode = INST_OP_EXIT};
10✔
42
    ebpf_platform_t platform = g_ebpf_platform_linux;
10✔
43
    ProgramInfo info{.platform = &platform, .type = platform.get_program_type("unspec", "unspec")};
25✔
44

45
    SECTION("call helper by BTF id") {
10✔
46
        RawProgram raw_prog{
2✔
47
            "", "", 0, "", {EbpfInst{.opcode = INST_OP_CALL, .src = INST_CALL_BTF_HELPER, .imm = 1}, exit}, info};
5✔
48
        auto prog_or_error = unmarshal(raw_prog, {});
2✔
49
        REQUIRE(std::holds_alternative<InstructionSeq>(prog_or_error));
2✔
50
        REQUIRE_THROWS_WITH(Program::from_sequence(std::get<InstructionSeq>(prog_or_error), info, {}),
9✔
51
                            Catch::Matchers::ContainsSubstring("not implemented: call helper by BTF id") &&
52
                                Catch::Matchers::ContainsSubstring("(at 0)"));
53
    }
12✔
54

55
    SECTION("lddw variable_addr pseudo") {
10✔
56
        RawProgram raw_prog{
2✔
57
            "",  "", 0, "", {EbpfInst{.opcode = INST_OP_LDDW_IMM, .dst = 1, .src = 3, .imm = 7}, EbpfInst{}, exit},
1✔
58
            info};
5✔
59
        auto prog_or_error = unmarshal(raw_prog, {});
2✔
60
        REQUIRE(std::holds_alternative<InstructionSeq>(prog_or_error));
2✔
61
        REQUIRE_THROWS_WITH(Program::from_sequence(std::get<InstructionSeq>(prog_or_error), info, {}),
9✔
62
                            Catch::Matchers::ContainsSubstring("not implemented: lddw variable_addr pseudo") &&
63
                                Catch::Matchers::ContainsSubstring("(at 0)"));
64
    }
12✔
65

66
    SECTION("helper id not usable on platform") {
10✔
67
        RawProgram raw_prog{"", "", 0, "", {EbpfInst{.opcode = INST_OP_CALL, .imm = 0x7fff}, exit}, info};
6✔
68
        auto prog_or_error = unmarshal(raw_prog, {});
2✔
69
        REQUIRE(std::holds_alternative<InstructionSeq>(prog_or_error));
2✔
70
        REQUIRE_THROWS_WITH(
9✔
71
            Program::from_sequence(std::get<InstructionSeq>(prog_or_error), info, {}),
72
            Catch::Matchers::ContainsSubstring("rejected: helper function is unavailable on this platform") &&
73
                Catch::Matchers::ContainsSubstring("(at 0)"));
74
    }
12✔
75

76
    SECTION("be64 requires base64 conformance group") {
10✔
77
        ebpf_platform_t p = g_ebpf_platform_linux;
2✔
78
        p.supported_conformance_groups &= ~bpf_conformance_groups_t::base64;
2✔
79
        ProgramInfo pinfo{.platform = &p, .type = p.get_program_type("unspec", "unspec")};
5✔
80
        RawProgram raw_prog{"",
2✔
81
                            "",
1✔
82
                            0,
83
                            "",
1✔
84
                            {EbpfInst{.opcode = static_cast<uint8_t>(INST_CLS_ALU | INST_ALU_OP_END | INST_END_BE),
85
                                      .dst = 1,
86
                                      .imm = 64},
87
                             exit},
88
                            pinfo};
5✔
89
        auto prog_or_error = unmarshal(raw_prog, {});
2✔
90
        REQUIRE(std::holds_alternative<InstructionSeq>(prog_or_error));
2✔
91
        REQUIRE_THROWS_WITH(Program::from_sequence(std::get<InstructionSeq>(prog_or_error), pinfo, {}),
9✔
92
                            Catch::Matchers::ContainsSubstring("rejected: requires conformance group base64") &&
93
                                Catch::Matchers::ContainsSubstring("(at 0)"));
94
    }
12✔
95

96
    SECTION("call btf cannot use register-call opcode form") {
10✔
97
        RawProgram raw_prog{
2✔
98
            "",  "", 0, "", {EbpfInst{.opcode = INST_OP_CALLX, .dst = 0, .src = INST_CALL_BTF_HELPER, .imm = 1}, exit},
1✔
99
            info};
5✔
100
        auto prog_or_error = unmarshal(raw_prog, {});
2✔
101
        REQUIRE(std::holds_alternative<std::string>(prog_or_error));
2✔
102
        REQUIRE_THAT(std::get<std::string>(prog_or_error), Catch::Matchers::ContainsSubstring("bad instruction"));
7✔
103
    }
12✔
104
}
10✔
105

106
// Verify a program in a section that may have multiple programs in it.
107
#define VERIFY_PROGRAM(dirname, filename, section_name, program_name, _options, platform, should_pass, count) \
108
    do {                                                                                                      \
109
        thread_local_options = _options;                                                                      \
110
        const auto raw_progs =                                                                                \
111
            read_elf("ebpf-samples/" dirname "/" filename, section_name, "", thread_local_options, platform); \
112
        REQUIRE(raw_progs.size() == count);                                                                   \
113
        for (const auto& raw_prog : raw_progs) {                                                              \
114
            if (count == 1 || raw_prog.function_name == program_name) {                                       \
115
                const auto prog_or_error = unmarshal(raw_prog, thread_local_options);                         \
116
                const auto inst_seq = std::get_if<InstructionSeq>(&prog_or_error);                            \
117
                REQUIRE(inst_seq);                                                                            \
118
                const Program prog = Program::from_sequence(*inst_seq, raw_prog.info, thread_local_options);  \
119
                REQUIRE(verify(prog) == should_pass);                                                         \
120
            }                                                                                                 \
121
        }                                                                                                     \
122
    } while (0)
123

124
// Verify a section with only one program in it.
125
#define VERIFY_SECTION(dirname, filename, section_name, _options, platform, should_pass) \
126
    VERIFY_PROGRAM(dirname, filename, section_name, "", _options, platform, should_pass, 1)
127

128
#define TEST_SECTION(project, filename, section)                                      \
129
    TEST_CASE(project "/" filename " " section, "[verify][samples][" project "]") {   \
130
        VERIFY_SECTION(project, filename, section, {}, &g_ebpf_platform_linux, true); \
131
    }
132

133
#define TEST_SECTION_SLOW(project, filename, section)                                     \
134
    TEST_CASE(project "/" filename " " section, "[verify][samples][slow][" project "]") { \
135
        VERIFY_SECTION(project, filename, section, {}, &g_ebpf_platform_linux, true);     \
136
    }
137

138
#define TEST_PROGRAM(project, filename, section_name, program_name, count)                                      \
139
    TEST_CASE(project "/" filename " " program_name, "[verify][samples][" project "]") {                        \
140
        VERIFY_PROGRAM(project, filename, section_name, program_name, {}, &g_ebpf_platform_linux, true, count); \
141
    }
142

143
#define TEST_PROGRAM_FAIL(project, filename, section_name, program_name, count)                                 \
144
    TEST_CASE(project "/" filename " " program_name, "[!shouldfail][verify][samples][" project "]") {           \
145
        VERIFY_PROGRAM(project, filename, section_name, program_name, {}, &g_ebpf_platform_linux, true, count); \
146
    }
147

148
#define TEST_PROGRAM_REJECT(project, filename, section_name, program_name, count)                                \
149
    TEST_CASE(project "/" filename " " program_name, "[verify][samples][" project "]") {                         \
150
        VERIFY_PROGRAM(project, filename, section_name, program_name, {}, &g_ebpf_platform_linux, false, count); \
151
    }
152

153
#define TEST_PROGRAM_REJECT_FAIL(project, filename, section_name, program_name, count)                           \
154
    TEST_CASE(project "/" filename " " program_name, "[!shouldfail][verify][samples][" project "]") {            \
155
        VERIFY_PROGRAM(project, filename, section_name, program_name, {}, &g_ebpf_platform_linux, false, count); \
156
    }
157

158
#define TEST_SECTION_REJECT(project, filename, section)                                \
159
    TEST_CASE(project "/" filename " " section, "[verify][samples][" project "]") {    \
160
        VERIFY_SECTION(project, filename, section, {}, &g_ebpf_platform_linux, false); \
161
    }
162

163
#define TEST_SECTION_REJECT_IF_STRICT(project, filename, section)                           \
164
    TEST_CASE(project "/" filename " " section, "[verify][samples][" project "]") {         \
165
        ebpf_verifier_options_t options{};                                                  \
166
        VERIFY_SECTION(project, filename, section, options, &g_ebpf_platform_linux, true);  \
167
        options.strict = true;                                                              \
168
        VERIFY_SECTION(project, filename, section, options, &g_ebpf_platform_linux, false); \
169
    }
170

171
#define TEST_SECTION_FAIL(project, filename, section)                                                              \
172
    TEST_CASE("expect failure " project "/" filename " " section, "[!shouldfail][verify][samples][" project "]") { \
173
        VERIFY_SECTION(project, filename, section, {}, &g_ebpf_platform_linux, true);                              \
174
    }
175

176
#define TEST_SECTION_FAIL_SLOW(project, filename, section)                            \
177
    TEST_CASE("expect failure " project "/" filename " " section,                     \
178
              "[!shouldfail][verify][samples][slow][" project "]") {                  \
179
        VERIFY_SECTION(project, filename, section, {}, &g_ebpf_platform_linux, true); \
180
    }
181

182
#define TEST_SECTION_REJECT_FAIL(project, filename, section)                                                       \
183
    TEST_CASE("expect failure " project "/" filename " " section, "[!shouldfail][verify][samples][" project "]") { \
184
        VERIFY_SECTION(project, filename, section, {}, &g_ebpf_platform_linux, false);                             \
185
    }
186

187
#define TEST_LEGACY(dirname, filename, sectionname)                                                             \
188
    TEST_CASE("Unsupported instructions: " dirname "/" filename " " sectionname, "[unmarshal]") {               \
189
        ebpf_platform_t platform = g_ebpf_platform_linux;                                                       \
190
        platform.supported_conformance_groups &= ~bpf_conformance_groups_t::packet;                             \
191
        auto raw_progs = read_elf("ebpf-samples/" dirname "/" filename, sectionname, "", {}, &platform);        \
192
        REQUIRE(raw_progs.size() == 1);                                                                         \
193
        RawProgram raw_prog = raw_progs.back();                                                                 \
194
        std::variant<InstructionSeq, std::string> prog_or_error = unmarshal(raw_prog, {});                      \
195
        REQUIRE(std::holds_alternative<InstructionSeq>(prog_or_error));                                         \
196
        REQUIRE_THROWS_WITH(Program::from_sequence(std::get<InstructionSeq>(prog_or_error), raw_prog.info, {}), \
197
                            Catch::Matchers::ContainsSubstring("rejected: requires conformance group packet")); \
198
    }
199

200
#define TEST_SECTION_LEGACY(dirname, filename, sectionname) \
201
    TEST_SECTION(dirname, filename, sectionname)            \
202
    TEST_LEGACY(dirname, filename, sectionname)
203

204
#define TEST_SECTION_LEGACY_SLOW(dirname, filename, sectionname) \
205
    TEST_SECTION_SLOW(dirname, filename, sectionname)            \
206
    TEST_LEGACY(dirname, filename, sectionname)
207

208
#define TEST_SECTION_LEGACY_FAIL(dirname, filename, sectionname) \
209
    TEST_SECTION_FAIL(dirname, filename, sectionname)            \
210
    TEST_LEGACY(dirname, filename, sectionname)
211

212
TEST_SECTION_SLOW("bpf_cilium_test", "bpf_lxc_jit.o", "1/0xdc06")
16✔
213
TEST_SECTION("bpf_cilium_test", "bpf_lxc_jit.o", "2/1")
16✔
214
TEST_SECTION("bpf_cilium_test", "bpf_lxc_jit.o", "2/3")
16✔
215
TEST_SECTION("bpf_cilium_test", "bpf_lxc_jit.o", "2/4")
16✔
216
TEST_SECTION("bpf_cilium_test", "bpf_lxc_jit.o", "2/5")
16✔
217
TEST_SECTION("bpf_cilium_test", "bpf_lxc_jit.o", "2/6")
16✔
218
TEST_SECTION_SLOW("bpf_cilium_test", "bpf_lxc_jit.o", "2/7")
16✔
219
TEST_SECTION_LEGACY_SLOW("bpf_cilium_test", "bpf_lxc_jit.o", "2/10")
33✔
220
TEST_SECTION("bpf_cilium_test", "bpf_lxc_jit.o", "from-container")
16✔
221

222
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DUNKNOWN.o", "1/0x1010")
16✔
223
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DUNKNOWN.o", "2/1")
16✔
224
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DUNKNOWN.o", "2/2")
16✔
225
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DUNKNOWN.o", "2/3")
16✔
226
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DUNKNOWN.o", "2/4")
16✔
227
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DUNKNOWN.o", "2/5")
16✔
228
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DUNKNOWN.o", "2/6")
16✔
229
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DUNKNOWN.o", "2/7")
16✔
230
TEST_SECTION_LEGACY("bpf_cilium_test", "bpf_lxc-DUNKNOWN.o", "from-container")
33✔
231

232
TEST_SECTION_SLOW("bpf_cilium_test", "bpf_lxc-DDROP_ALL.o", "1/0x1010")
16✔
233
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DDROP_ALL.o", "2/1")
16✔
234
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DDROP_ALL.o", "2/2")
16✔
235
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DDROP_ALL.o", "2/3")
16✔
236
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DDROP_ALL.o", "2/4")
16✔
237
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DDROP_ALL.o", "2/5")
16✔
238
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DDROP_ALL.o", "2/6")
16✔
239
TEST_SECTION_SLOW("bpf_cilium_test", "bpf_lxc-DDROP_ALL.o", "2/7")
16✔
240
TEST_SECTION("bpf_cilium_test", "bpf_lxc-DDROP_ALL.o", "from-container")
16✔
241

242
TEST_SECTION("bpf_cilium_test", "bpf_netdev.o", "2/1")
16✔
243
TEST_SECTION("bpf_cilium_test", "bpf_netdev.o", "2/2")
16✔
244
TEST_SECTION("bpf_cilium_test", "bpf_netdev.o", "2/3")
16✔
245
TEST_SECTION("bpf_cilium_test", "bpf_netdev.o", "2/4")
16✔
246
TEST_SECTION("bpf_cilium_test", "bpf_netdev.o", "2/5")
16✔
247
TEST_SECTION("bpf_cilium_test", "bpf_netdev.o", "2/7")
16✔
248

249
TEST_SECTION("bpf_cilium_test", "bpf_overlay.o", "2/1")
16✔
250
TEST_SECTION("bpf_cilium_test", "bpf_overlay.o", "2/2")
16✔
251
TEST_SECTION("bpf_cilium_test", "bpf_overlay.o", "2/3")
16✔
252
TEST_SECTION("bpf_cilium_test", "bpf_overlay.o", "2/4")
16✔
253
TEST_SECTION("bpf_cilium_test", "bpf_overlay.o", "2/5")
16✔
254
TEST_SECTION("bpf_cilium_test", "bpf_overlay.o", "2/7")
16✔
255
TEST_SECTION("bpf_cilium_test", "bpf_overlay.o", "3/2")
16✔
256
TEST_SECTION_LEGACY_SLOW("bpf_cilium_test", "bpf_overlay.o", "from-overlay")
33✔
257

258
TEST_SECTION("bpf_cilium_test", "bpf_lb-DLB_L3.o", "2/1")
16✔
259
TEST_SECTION("bpf_cilium_test", "bpf_lb-DLB_L3.o", "2/2")
16✔
260
TEST_SECTION("bpf_cilium_test", "bpf_lb-DLB_L3.o", "from-netdev")
16✔
261

262
TEST_SECTION("bpf_cilium_test", "bpf_lb-DLB_L4.o", "2/1")
16✔
263
TEST_SECTION("bpf_cilium_test", "bpf_lb-DLB_L4.o", "2/2")
16✔
264
TEST_SECTION("bpf_cilium_test", "bpf_lb-DLB_L4.o", "from-netdev")
16✔
265

266
TEST_SECTION("bpf_cilium_test", "bpf_lb-DUNKNOWN.o", "2/1")
16✔
267
TEST_SECTION("bpf_cilium_test", "bpf_lb-DUNKNOWN.o", "2/2")
16✔
268
TEST_SECTION("bpf_cilium_test", "bpf_lb-DUNKNOWN.o", "from-netdev")
16✔
269

270
TEST_SECTION("cilium", "bpf_lb.o", "2/1")
16✔
271
TEST_SECTION("cilium", "bpf_lb.o", "from-netdev")
16✔
272

273
TEST_SECTION("cilium", "bpf_lxc.o", "1/0x1010")
16✔
274
TEST_SECTION("cilium", "bpf_lxc.o", "2/1")
16✔
275
TEST_SECTION("cilium", "bpf_lxc.o", "2/3")
16✔
276
TEST_SECTION("cilium", "bpf_lxc.o", "2/4")
16✔
277
TEST_SECTION("cilium", "bpf_lxc.o", "2/5")
16✔
278
TEST_SECTION("cilium", "bpf_lxc.o", "2/6")
16✔
279
TEST_SECTION("cilium", "bpf_lxc.o", "2/8")
16✔
280
TEST_SECTION("cilium", "bpf_lxc.o", "2/9")
16✔
281
TEST_SECTION("cilium", "bpf_lxc.o", "from-container")
16✔
282

283
TEST_SECTION("cilium", "bpf_netdev.o", "2/1")
16✔
284
TEST_SECTION("cilium", "bpf_netdev.o", "2/3")
16✔
285
TEST_SECTION("cilium", "bpf_netdev.o", "2/4")
16✔
286
TEST_SECTION("cilium", "bpf_netdev.o", "2/5")
16✔
287
TEST_SECTION("cilium", "bpf_netdev.o", "2/7")
16✔
288

289
TEST_SECTION("cilium", "bpf_overlay.o", "2/1")
16✔
290
TEST_SECTION("cilium", "bpf_overlay.o", "2/3")
16✔
291
TEST_SECTION("cilium", "bpf_overlay.o", "2/4")
16✔
292
TEST_SECTION("cilium", "bpf_overlay.o", "2/5")
16✔
293
TEST_SECTION("cilium", "bpf_overlay.o", "2/7")
16✔
294
TEST_SECTION_LEGACY("cilium", "bpf_overlay.o", "from-overlay")
33✔
295

296
TEST_SECTION("cilium", "bpf_xdp.o", "from-netdev")
16✔
297

298
TEST_SECTION("cilium", "bpf_xdp_dsr_linux_v1_1.o", "from-netdev")
16✔
299
TEST_SECTION("cilium", "bpf_xdp_dsr_linux.o", "2/1")
16✔
300
TEST_SECTION("cilium", "bpf_xdp_dsr_linux.o", "from-netdev")
16✔
301

302
TEST_SECTION("cilium", "bpf_xdp_snat_linux.o", "2/1")
16✔
303
TEST_SECTION("cilium", "bpf_xdp_snat_linux.o", "from-netdev")
16✔
304

305
TEST_SECTION("linux", "cpustat_kern.o", "tracepoint/power/cpu_frequency")
16✔
306
TEST_SECTION("linux", "cpustat_kern.o", "tracepoint/power/cpu_idle")
16✔
307
TEST_SECTION("linux", "lathist_kern.o", "kprobe/trace_preempt_off")
16✔
308
TEST_SECTION("linux", "lathist_kern.o", "kprobe/trace_preempt_on")
16✔
309
TEST_SECTION("linux", "lwt_len_hist_kern.o", "len_hist")
16✔
310
TEST_SECTION("linux", "map_perf_test_kern.o", "kprobe/sys_getegid")
16✔
311
TEST_SECTION("linux", "map_perf_test_kern.o", "kprobe/sys_geteuid")
16✔
312
TEST_SECTION("linux", "map_perf_test_kern.o", "kprobe/sys_getgid")
16✔
313
TEST_SECTION("linux", "map_perf_test_kern.o", "kprobe/sys_getpgid")
16✔
314
TEST_SECTION("linux", "map_perf_test_kern.o", "kprobe/sys_getppid")
16✔
315
TEST_SECTION("linux", "map_perf_test_kern.o", "kprobe/sys_gettid")
16✔
316
TEST_SECTION("linux", "map_perf_test_kern.o", "kprobe/sys_getuid")
16✔
317
TEST_SECTION("linux", "offwaketime_kern.o", "kprobe/try_to_wake_up")
16✔
318
TEST_SECTION("linux", "offwaketime_kern.o", "tracepoint/sched/sched_switch")
16✔
319
TEST_SECTION("linux", "sampleip_kern.o", "perf_event")
16✔
320
TEST_SECTION("linux", "sock_flags_kern.o", "cgroup/sock1")
16✔
321
TEST_SECTION("linux", "sock_flags_kern.o", "cgroup/sock2")
16✔
322
TEST_SECTION_LEGACY("linux", "sockex1_kern.o", "socket1")
33✔
323
TEST_SECTION_LEGACY("linux", "sockex2_kern.o", "socket2")
33✔
324
TEST_SECTION_LEGACY("linux", "sockex3_kern.o", "socket/3")
33✔
325
TEST_SECTION_LEGACY("linux", "sockex3_kern.o", "socket/4")
33✔
326
TEST_SECTION_LEGACY("linux", "sockex3_kern.o", "socket/1")
33✔
327
TEST_SECTION_LEGACY("linux", "sockex3_kern.o", "socket/2")
33✔
328
TEST_SECTION_LEGACY("linux", "sockex3_kern.o", "socket/0")
33✔
329
TEST_SECTION("linux", "spintest_kern.o", "kprobe/__htab_percpu_map_update_elem")
16✔
330
TEST_SECTION("linux", "spintest_kern.o", "kprobe/_raw_spin_lock")
16✔
331
TEST_SECTION("linux", "spintest_kern.o", "kprobe/_raw_spin_lock_bh")
16✔
332
TEST_SECTION("linux", "spintest_kern.o", "kprobe/_raw_spin_lock_irq")
16✔
333
TEST_SECTION("linux", "spintest_kern.o", "kprobe/_raw_spin_lock_irqsave")
16✔
334
TEST_SECTION("linux", "spintest_kern.o", "kprobe/_raw_spin_trylock_bh")
16✔
335
TEST_SECTION("linux", "spintest_kern.o", "kprobe/_raw_spin_trylock")
16✔
336
TEST_SECTION("linux", "spintest_kern.o", "kprobe/_raw_spin_unlock")
16✔
337
TEST_SECTION("linux", "spintest_kern.o", "kprobe/_raw_spin_unlock_bh")
16✔
338
TEST_SECTION("linux", "spintest_kern.o", "kprobe/_raw_spin_unlock_irqrestore")
16✔
339
TEST_SECTION("linux", "spintest_kern.o", "kprobe/htab_map_alloc")
16✔
340
TEST_SECTION("linux", "spintest_kern.o", "kprobe/htab_map_update_elem")
16✔
341
TEST_SECTION("linux", "spintest_kern.o", "kprobe/mutex_spin_on_owner")
16✔
342
TEST_SECTION("linux", "spintest_kern.o", "kprobe/rwsem_spin_on_owner")
16✔
343
TEST_SECTION("linux", "spintest_kern.o", "kprobe/spin_lock")
16✔
344
TEST_SECTION("linux", "spintest_kern.o", "kprobe/spin_unlock")
16✔
345
TEST_SECTION("linux", "spintest_kern.o", "kprobe/spin_unlock_irqrestore")
16✔
346
TEST_SECTION("linux", "syscall_tp_kern.o", "tracepoint/syscalls/sys_enter_open")
16✔
347
TEST_SECTION("linux", "syscall_tp_kern.o", "tracepoint/syscalls/sys_exit_open")
16✔
348
TEST_SECTION("linux", "task_fd_query_kern.o", "kprobe/blk_start_request")
16✔
349
TEST_SECTION("linux", "task_fd_query_kern.o", "kretprobe/blk_account_io_completion")
16✔
350
TEST_SECTION("linux", "tc_l2_redirect_kern.o", "drop_non_tun_vip")
16✔
351
TEST_SECTION("linux", "tc_l2_redirect_kern.o", "l2_to_ip6tun_ingress_redirect")
16✔
352
TEST_SECTION("linux", "tc_l2_redirect_kern.o", "l2_to_iptun_ingress_forward")
16✔
353
TEST_SECTION("linux", "tc_l2_redirect_kern.o", "l2_to_iptun_ingress_redirect")
16✔
354
TEST_SECTION("linux", "tcp_basertt_kern.o", "sockops")
16✔
355
TEST_SECTION("linux", "tcp_bufs_kern.o", "sockops")
16✔
356
TEST_SECTION("linux", "tcp_cong_kern.o", "sockops")
16✔
357
TEST_SECTION("linux", "tcp_iw_kern.o", "sockops")
16✔
358
TEST_SECTION_LEGACY("linux", "tcbpf1_kern.o", "classifier")
33✔
359
TEST_SECTION("linux", "tcbpf1_kern.o", "clone_redirect_recv")
16✔
360
TEST_SECTION("linux", "tcbpf1_kern.o", "clone_redirect_xmit")
16✔
361
TEST_SECTION("linux", "tcbpf1_kern.o", "redirect_recv")
16✔
362
TEST_SECTION("linux", "tcbpf1_kern.o", "redirect_xmit")
16✔
363
TEST_SECTION("linux", "tcp_clamp_kern.o", "sockops")
16✔
364
TEST_SECTION("linux", "tcp_rwnd_kern.o", "sockops")
16✔
365
TEST_SECTION("linux", "tcp_synrto_kern.o", "sockops")
16✔
366
TEST_SECTION("linux", "test_cgrp2_tc_kern.o", "filter")
16✔
367
TEST_SECTION("linux", "test_current_task_under_cgroup_kern.o", "kprobe/sys_sync")
16✔
368
TEST_SECTION("linux", "test_overhead_kprobe_kern.o", "kprobe/__set_task_comm")
16✔
369
TEST_SECTION("linux", "test_overhead_kprobe_kern.o", "kprobe/urandom_read")
16✔
370
TEST_SECTION("linux", "test_overhead_raw_tp_kern.o", "raw_tracepoint/task_rename")
16✔
371
TEST_SECTION("linux", "test_overhead_raw_tp_kern.o", "raw_tracepoint/urandom_read")
16✔
372
TEST_SECTION("linux", "test_overhead_tp_kern.o", "tracepoint/random/urandom_read")
16✔
373
TEST_SECTION("linux", "test_overhead_tp_kern.o", "tracepoint/task/task_rename")
16✔
374
TEST_SECTION("linux", "test_probe_write_user_kern.o", "kprobe/sys_connect")
16✔
375
TEST_SECTION("linux", "trace_event_kern.o", "perf_event")
16✔
376
TEST_SECTION("linux", "trace_output_kern.o", "kprobe/sys_write")
16✔
377
TEST_SECTION("linux", "tracex1_kern.o", "kprobe/__netif_receive_skb_core")
16✔
378
TEST_SECTION("linux", "tracex2_kern.o", "kprobe/kfree_skb")
16✔
379
TEST_SECTION("linux", "tracex2_kern.o", "kprobe/sys_write")
16✔
380
TEST_SECTION("linux", "tracex3_kern.o", "kprobe/blk_account_io_completion")
16✔
381
TEST_SECTION("linux", "tracex3_kern.o", "kprobe/blk_start_request")
16✔
382
TEST_SECTION("linux", "tracex4_kern.o", "kprobe/kmem_cache_free")
16✔
383
TEST_SECTION("linux", "tracex4_kern.o", "kretprobe/kmem_cache_alloc_node")
16✔
384
TEST_SECTION("linux", "tracex5_kern.o", "kprobe/__seccomp_filter")
16✔
385
TEST_SECTION("linux", "tracex5_kern.o", "kprobe/0")
16✔
386
TEST_SECTION("linux", "tracex5_kern.o", "kprobe/1")
16✔
387
TEST_SECTION("linux", "tracex5_kern.o", "kprobe/9")
16✔
388
TEST_SECTION("linux", "tracex6_kern.o", "kprobe/htab_map_get_next_key")
16✔
389
TEST_SECTION("linux", "tracex6_kern.o", "kprobe/htab_map_lookup_elem")
16✔
390
TEST_SECTION("linux", "tracex7_kern.o", "kprobe/open_ctree")
16✔
391
TEST_SECTION("linux", "xdp_adjust_tail_kern.o", "xdp_icmp")
16✔
392
TEST_SECTION("linux", "xdp_fwd_kern.o", "xdp_fwd")
16✔
393
TEST_SECTION("linux", "xdp_fwd_kern.o", "xdp_fwd_direct")
16✔
394
TEST_SECTION("linux", "xdp_monitor_kern.o", "tracepoint/xdp/xdp_cpumap_enqueue")
16✔
395
TEST_SECTION("linux", "xdp_monitor_kern.o", "tracepoint/xdp/xdp_cpumap_kthread")
16✔
396
TEST_SECTION("linux", "xdp_monitor_kern.o", "tracepoint/xdp/xdp_devmap_xmit")
16✔
397
TEST_SECTION("linux", "xdp_monitor_kern.o", "tracepoint/xdp/xdp_exception")
16✔
398
TEST_SECTION("linux", "xdp_monitor_kern.o", "tracepoint/xdp/xdp_redirect")
16✔
399
TEST_SECTION("linux", "xdp_monitor_kern.o", "tracepoint/xdp/xdp_redirect_err")
16✔
400
TEST_SECTION("linux", "xdp_monitor_kern.o", "tracepoint/xdp/xdp_redirect_map")
16✔
401
TEST_SECTION("linux", "xdp_monitor_kern.o", "tracepoint/xdp/xdp_redirect_map_err")
16✔
402
TEST_SECTION("linux", "xdp_redirect_cpu_kern.o", "xdp_cpu_map0")
16✔
403
TEST_SECTION("linux", "xdp_redirect_cpu_kern.o", "xdp_cpu_map1_touch_data")
16✔
404
TEST_SECTION("linux", "xdp_redirect_cpu_kern.o", "xdp_cpu_map2_round_robin")
16✔
405
TEST_SECTION("linux", "xdp_redirect_cpu_kern.o", "xdp_cpu_map3_proto_separate")
16✔
406
TEST_SECTION("linux", "xdp_redirect_cpu_kern.o", "xdp_cpu_map4_ddos_filter_pktgen")
16✔
407
TEST_SECTION("linux", "xdp_redirect_cpu_kern.o", "xdp_cpu_map5_lb_hash_ip_pairs")
16✔
408
TEST_SECTION("linux", "xdp_redirect_cpu_kern.o", "tracepoint/xdp/xdp_cpumap_enqueue")
16✔
409
TEST_SECTION("linux", "xdp_redirect_cpu_kern.o", "tracepoint/xdp/xdp_cpumap_kthread")
16✔
410
TEST_SECTION("linux", "xdp_redirect_cpu_kern.o", "tracepoint/xdp/xdp_exception")
16✔
411
TEST_SECTION("linux", "xdp_redirect_cpu_kern.o", "tracepoint/xdp/xdp_redirect_err")
16✔
412
TEST_SECTION("linux", "xdp_redirect_cpu_kern.o", "tracepoint/xdp/xdp_redirect_map_err")
16✔
413
TEST_SECTION("linux", "xdp_redirect_kern.o", "xdp_redirect")
16✔
414
TEST_SECTION("linux", "xdp_redirect_kern.o", "xdp_redirect_dummy")
16✔
415
TEST_SECTION("linux", "xdp_redirect_map_kern.o", "xdp_redirect_dummy")
16✔
416
TEST_SECTION("linux", "xdp_redirect_map_kern.o", "xdp_redirect_map")
16✔
417
TEST_SECTION("linux", "xdp_router_ipv4_kern.o", "xdp_router_ipv4")
16✔
418
TEST_SECTION("linux", "xdp_rxq_info_kern.o", "xdp_prog0")
16✔
419
TEST_SECTION("linux", "xdp_sample_pkts_kern.o", "xdp_sample")
16✔
420
TEST_SECTION("linux", "xdp_tx_iptunnel_kern.o", "xdp_tx_iptunnel")
16✔
421
TEST_SECTION("linux", "xdp1_kern.o", "xdp1")
16✔
422
TEST_SECTION("linux", "xdp2_kern.o", "xdp1")
16✔
423
TEST_SECTION("linux", "xdp2skb_meta_kern.o", "tc_mark")
16✔
424
TEST_SECTION("linux", "xdp2skb_meta_kern.o", "xdp_mark")
16✔
425
TEST_SECTION("linux", "xdpsock_kern.o", "xdp_sock")
16✔
426
// Finally passes; still requires double-check
427
TEST_SECTION("linux", "map_perf_test_kern.o", "kprobe/sys_connect")
16✔
428

429
TEST_SECTION("prototype-kernel", "napi_monitor_kern.o", "tracepoint/irq/softirq_entry")
16✔
430
TEST_SECTION("prototype-kernel", "napi_monitor_kern.o", "tracepoint/irq/softirq_exit")
16✔
431
TEST_SECTION("prototype-kernel", "napi_monitor_kern.o", "tracepoint/irq/softirq_raise")
16✔
432
TEST_SECTION("prototype-kernel", "napi_monitor_kern.o", "tracepoint/napi/napi_poll")
16✔
433
TEST_SECTION("prototype-kernel", "tc_bench01_redirect_kern.o", "ingress_redirect")
16✔
434
TEST_SECTION("prototype-kernel", "xdp_bench01_mem_access_cost_kern.o", "xdp_bench01")
16✔
435
TEST_SECTION("prototype-kernel", "xdp_bench02_drop_pattern_kern.o", "xdp_bench02")
16✔
436
TEST_SECTION("prototype-kernel", "xdp_monitor_kern.o", "tracepoint/xdp/xdp_redirect")
16✔
437
TEST_SECTION("prototype-kernel", "xdp_monitor_kern.o", "tracepoint/xdp/xdp_redirect_err")
16✔
438
TEST_SECTION("prototype-kernel", "xdp_monitor_kern.o", "tracepoint/xdp/xdp_redirect_map_err")
16✔
439
TEST_SECTION("prototype-kernel", "xdp_monitor_kern.o", "tracepoint/xdp/xdp_redirect_map")
16✔
440
TEST_SECTION("prototype-kernel", "xdp_redirect_cpu_kern.o", "xdp_cpu_map0")
16✔
441
TEST_SECTION("prototype-kernel", "xdp_redirect_cpu_kern.o", "xdp_cpu_map2_round_robin")
16✔
442
TEST_SECTION("prototype-kernel", "xdp_redirect_cpu_kern.o", "tracepoint/xdp/xdp_cpumap_enqueue")
16✔
443
TEST_SECTION("prototype-kernel", "xdp_redirect_cpu_kern.o", "tracepoint/xdp/xdp_cpumap_kthread")
16✔
444
TEST_SECTION("prototype-kernel", "xdp_redirect_cpu_kern.o", "tracepoint/xdp/xdp_exception")
16✔
445
TEST_SECTION("prototype-kernel", "xdp_redirect_cpu_kern.o", "tracepoint/xdp/xdp_redirect_err")
16✔
446
TEST_SECTION("prototype-kernel", "xdp_redirect_cpu_kern.o", "tracepoint/xdp/xdp_redirect_map_err")
16✔
447
TEST_SECTION("prototype-kernel", "xdp_redirect_cpu_kern.o", "xdp_cpu_map1_touch_data")
16✔
448
TEST_SECTION("prototype-kernel", "xdp_redirect_cpu_kern.o", "xdp_cpu_map3_proto_separate")
16✔
449
TEST_SECTION("prototype-kernel", "xdp_redirect_cpu_kern.o", "xdp_cpu_map4_ddos_filter_pktgen")
16✔
450
TEST_SECTION("prototype-kernel", "xdp_redirect_cpu_kern.o", "xdp_cpu_map5_ip_l3_flow_hash")
16✔
451
TEST_SECTION("prototype-kernel", "xdp_redirect_err_kern.o", "xdp_redirect_dummy")
16✔
452
TEST_SECTION("prototype-kernel", "xdp_redirect_err_kern.o", "xdp_redirect_map")
16✔
453
TEST_SECTION("prototype-kernel", "xdp_redirect_err_kern.o", "xdp_redirect_map_rr")
16✔
454
TEST_SECTION("prototype-kernel", "xdp_tcpdump_kern.o", "xdp_tcpdump_to_perf_ring")
16✔
455
TEST_SECTION("prototype-kernel", "xdp_ttl_kern.o", "xdp_ttl")
16✔
456
TEST_SECTION("prototype-kernel", "xdp_vlan01_kern.o", "tc_vlan_push")
16✔
457
TEST_SECTION("prototype-kernel", "xdp_vlan01_kern.o", "xdp_drop_vlan_4011")
16✔
458
TEST_SECTION("prototype-kernel", "xdp_vlan01_kern.o", "xdp_vlan_change")
16✔
459
TEST_SECTION("prototype-kernel", "xdp_vlan01_kern.o", "xdp_vlan_remove_outer")
16✔
460
TEST_SECTION("prototype-kernel", "xdp_vlan01_kern.o", "xdp_vlan_remove_outer2")
16✔
461

462
TEST_SECTION("ovs", "datapath.o", "tail-0")
16✔
463
TEST_SECTION("ovs", "datapath.o", "tail-1")
16✔
464
TEST_SECTION("ovs", "datapath.o", "tail-2")
16✔
465
TEST_SECTION_LEGACY("ovs", "datapath.o", "tail-3")
33✔
466
TEST_SECTION("ovs", "datapath.o", "tail-4")
16✔
467
TEST_SECTION("ovs", "datapath.o", "tail-5")
16✔
468
TEST_SECTION("ovs", "datapath.o", "tail-7")
16✔
469
TEST_SECTION("ovs", "datapath.o", "tail-8")
16✔
470
TEST_SECTION("ovs", "datapath.o", "tail-11")
16✔
471
TEST_SECTION("ovs", "datapath.o", "tail-12")
16✔
472
TEST_SECTION("ovs", "datapath.o", "tail-13")
16✔
473
TEST_SECTION_LEGACY("ovs", "datapath.o", "tail-32")
33✔
474
TEST_SECTION("ovs", "datapath.o", "tail-33")
16✔
475
TEST_SECTION("ovs", "datapath.o", "tail-35")
16✔
476
TEST_SECTION("ovs", "datapath.o", "af_xdp")
16✔
477
TEST_SECTION("ovs", "datapath.o", "downcall")
16✔
478
TEST_SECTION("ovs", "datapath.o", "egress")
16✔
479
TEST_SECTION("ovs", "datapath.o", "ingress")
16✔
480
TEST_SECTION("ovs", "datapath.o", "xdp")
16✔
481

482
TEST_SECTION_LEGACY("suricata", "bypass_filter.o", "filter")
33✔
483
TEST_SECTION_LEGACY("suricata", "lb.o", "loadbalancer")
33✔
484
TEST_SECTION("suricata", "filter.o", "filter")
16✔
485
TEST_SECTION("suricata", "vlan_filter.o", "filter")
16✔
486
TEST_SECTION("suricata", "xdp_filter.o", "xdp")
16✔
487

488
TEST_SECTION("falco", "probe.o", "raw_tracepoint/filler/sys_accept4_e")
16✔
489
TEST_SECTION("falco", "probe.o", "raw_tracepoint/filler/sys_empty")
16✔
490
TEST_SECTION("falco", "probe.o", "raw_tracepoint/filler/sys_pread64_e")
16✔
491
TEST_SECTION("falco", "probe.o", "raw_tracepoint/filler/sys_preadv64_e")
16✔
492
TEST_SECTION("falco", "probe.o", "raw_tracepoint/filler/sys_pwrite64_e")
16✔
493
TEST_SECTION("falco", "probe.o", "raw_tracepoint/filler/sys_single_x")
16✔
494
TEST_SECTION("falco", "probe.o", "raw_tracepoint/filler/sys_sysdigevent_e")
16✔
495
TEST_SECTION("falco", "probe.o", "raw_tracepoint/filler/terminate_filler")
16✔
496
TEST_SECTION("falco", "probe.o", "raw_tracepoint/page_fault_kernel")
16✔
497
TEST_SECTION("falco", "probe.o", "raw_tracepoint/page_fault_user")
16✔
498
TEST_SECTION("falco", "probe.o", "raw_tracepoint/sched_switch")
16✔
499
TEST_SECTION("falco", "probe.o", "raw_tracepoint/signal_deliver")
16✔
500

501
// Test some programs that should pass verification except when the strict flag is set.
502
TEST_SECTION_REJECT_IF_STRICT("build", "mapoverflow.o", ".text")
30✔
503
TEST_SECTION_REJECT_IF_STRICT("build", "mapunderflow.o", ".text")
30✔
504

505
/*
506
 * These programs contain "call -1" instruction and cannot be verified:
507
TEST_SECTION("raw_tracepoint/filler/sys_access_e")
508
TEST_SECTION("raw_tracepoint/filler/sys_bpf_x")
509
TEST_SECTION("raw_tracepoint/filler/sys_brk_munmap_mmap_x")
510
TEST_SECTION("raw_tracepoint/filler/sys_eventfd_e")
511
TEST_SECTION("raw_tracepoint/filler/sys_execve_e")
512
TEST_SECTION("raw_tracepoint/filler/sys_generic")
513
TEST_SECTION("raw_tracepoint/filler/sys_getrlimit_setrlimit_e")
514
TEST_SECTION("raw_tracepoint/filler/sys_getrlimit_setrlrimit_x")
515
TEST_SECTION("raw_tracepoint/filler/sys_mount_e")
516
TEST_SECTION("raw_tracepoint/filler/sys_nanosleep_e")
517
TEST_SECTION("raw_tracepoint/filler/sys_pagefault_e")
518
TEST_SECTION("raw_tracepoint/filler/sys_procexit_e")
519
TEST_SECTION("raw_tracepoint/filler/sys_single")
520
TEST_SECTION("raw_tracepoint/filler/sys_unshare_e")
521
TEST_SECTION("raw_tracepoint/sched_process_exit")
522
TEST_SECTION("raw_tracepoint/filler/sys_chmod_x")
523
TEST_SECTION("raw_tracepoint/filler/sys_fchmod_x")
524
TEST_SECTION("raw_tracepoint/filler/sys_fcntl_e")
525
TEST_SECTION("raw_tracepoint/filler/sys_flock_e")
526
TEST_SECTION("raw_tracepoint/filler/sys_poll_x")
527
TEST_SECTION("raw_tracepoint/filler/sys_prlimit_e")
528
TEST_SECTION("raw_tracepoint/filler/sys_prlimit_x")
529
TEST_SECTION("raw_tracepoint/filler/sys_ptrace_e")
530
TEST_SECTION("raw_tracepoint/filler/sys_quotactl_e")
531
TEST_SECTION("raw_tracepoint/filler/sys_semop_x")
532
TEST_SECTION("raw_tracepoint/filler/sys_send_e")
533
TEST_SECTION("raw_tracepoint/filler/sys_sendfile_x")
534
TEST_SECTION("raw_tracepoint/filler/sys_setns_e")
535
TEST_SECTION("raw_tracepoint/filler/sys_shutdown_e")
536
TEST_SECTION("raw_tracepoint/filler/sys_fchmodat_x")
537
TEST_SECTION("raw_tracepoint/filler/sys_futex_e")
538
TEST_SECTION("raw_tracepoint/filler/sys_lseek_e")
539
TEST_SECTION("raw_tracepoint/filler/sys_mkdirat_x")
540
TEST_SECTION("raw_tracepoint/filler/sys_poll_e")
541
TEST_SECTION("raw_tracepoint/filler/sys_ptrace_x")
542
TEST_SECTION("raw_tracepoint/filler/sys_quotactl_x")
543
TEST_SECTION("raw_tracepoint/filler/sys_semget_e")
544
TEST_SECTION("raw_tracepoint/filler/sys_signaldeliver_e")
545
TEST_SECTION("raw_tracepoint/filler/sys_symlinkat_x")
546
TEST_SECTION("raw_tracepoint/filler/sys_unlinkat_x")
547
TEST_SECTION("raw_tracepoint/filler/sys_writev_e")
548
TEST_SECTION("raw_tracepoint/filler/sys_llseek_e")
549
TEST_SECTION("raw_tracepoint/filler/sys_ppoll_e")
550
TEST_SECTION("raw_tracepoint/filler/sys_pwritev_e")
551
TEST_SECTION("raw_tracepoint/filler/sys_renameat_x")
552
TEST_SECTION("raw_tracepoint/filler/sys_semctl_e")
553
TEST_SECTION("raw_tracepoint/filler/sched_switch_e")
554
TEST_SECTION("raw_tracepoint/filler/sys_getsockopt_x")
555
TEST_SECTION("raw_tracepoint/filler/sys_linkat_x")
556
TEST_SECTION("raw_tracepoint/filler/sys_renameat2_x")
557
TEST_SECTION("raw_tracepoint/filler/sys_sendfile_e")
558
TEST_SECTION("raw_tracepoint/filler/sys_setsockopt_x")
559
TEST_SECTION("raw_tracepoint/filler/sys_getresuid_and_gid_x")
560
TEST_SECTION("raw_tracepoint/filler/sys_mmap_e")
561
TEST_SECTION("raw_tracepoint/filler/sys_socket_bind_x")
562
TEST_SECTION("raw_tracepoint/filler/sys_socket_x")
563
TEST_SECTION("raw_tracepoint/sys_enter")
564
TEST_SECTION("raw_tracepoint/sys_exit")
565
TEST_SECTION("raw_tracepoint/filler/sys_pipe_x")
566
TEST_SECTION("raw_tracepoint/filler/sys_socketpair_x")
567
TEST_SECTION("raw_tracepoint/filler/sys_creat_x")
568
TEST_SECTION("raw_tracepoint/filler/sys_open_x")
569
TEST_SECTION("raw_tracepoint/filler/sys_openat_x")
570
TEST_SECTION("raw_tracepoint/filler/sys_autofill")
571
TEST_SECTION("raw_tracepoint/filler/proc_startupdate")
572
TEST_SECTION("raw_tracepoint/filler/sys_recvmsg_x_2")
573
TEST_SECTION("raw_tracepoint/filler/sys_sendmsg_e")
574
TEST_SECTION("raw_tracepoint/filler/sys_connect_x")
575
TEST_SECTION("raw_tracepoint/filler/sys_sendto_e")
576
TEST_SECTION("raw_tracepoint/filler/sys_accept_x")
577
TEST_SECTION("raw_tracepoint/filler/sys_read_x")
578
TEST_SECTION("raw_tracepoint/filler/sys_recv_x")
579
TEST_SECTION("raw_tracepoint/filler/sys_recvmsg_x")
580
TEST_SECTION("raw_tracepoint/filler/sys_send_x")
581
TEST_SECTION("raw_tracepoint/filler/proc_startupdate_3")
582
TEST_SECTION("raw_tracepoint/filler/sys_readv_preadv_x")
583
TEST_SECTION("raw_tracepoint/filler/sys_write_x")
584
TEST_SECTION("raw_tracepoint/filler/sys_writev_pwritev_x")
585
TEST_SECTION("raw_tracepoint/filler/sys_sendmsg_x")
586
TEST_SECTION("raw_tracepoint/filler/proc_startupdate_2")
587
TEST_SECTION("raw_tracepoint/filler/sys_recvfrom_x")
588
*/
589

590
TEST_PROGRAM("build", "bpf2bpf.o", ".text", "add1", 2);
19✔
591
TEST_PROGRAM("build", "bpf2bpf.o", ".text", "add2", 2);
19✔
592
TEST_PROGRAM("build", "bpf2bpf.o", "test", "func", 1);
16✔
593

594
TEST_SECTION("build", "byteswap.o", ".text")
16✔
595
TEST_SECTION("build", "stackok.o", ".text")
16✔
596
TEST_SECTION("build", "packet_start_ok.o", "xdp")
16✔
597
TEST_SECTION("build", "packet_access.o", "xdp")
16✔
598
TEST_SECTION("build", "tail_call.o", "xdp_prog")
16✔
599
TEST_SECTION("build", "map_in_map.o", ".text")
16✔
600
TEST_SECTION("build", "map_in_map_anonymous.o", ".text")
16✔
601
TEST_SECTION("build", "map_in_map_legacy.o", ".text")
16✔
602
TEST_SECTION("build", "store_map_value_in_map.o", ".text")
16✔
603
TEST_SECTION("build", "twomaps.o", ".text");
16✔
604
TEST_SECTION("build", "twostackvars.o", ".text");
16✔
605
TEST_SECTION("build", "twotypes.o", ".text");
16✔
606
TEST_SECTION("build", "global_variable.o", ".text")
16✔
607
TEST_PROGRAM("build", "prog_array.o", ".text", "func", 5);
25✔
608
TEST_PROGRAM("build", "prog_array.o", ".text", "func0", 5);
25✔
609
TEST_PROGRAM("build", "prog_array.o", ".text", "func1", 5);
25✔
610
TEST_PROGRAM("build", "prog_array.o", ".text", "func2", 5);
25✔
611
TEST_PROGRAM("build", "prog_array.o", ".text", "func3", 5);
25✔
612

613
// Test some programs that ought to fail verification.
614
TEST_SECTION_REJECT("build", "badmapptr.o", "test")
16✔
615
TEST_SECTION_REJECT("build", "badhelpercall.o", ".text")
16✔
616
TEST_SECTION_REJECT("build", "ctxoffset.o", "sockops")
16✔
617
TEST_SECTION_FAIL("build", "dependent_read.o", "xdp")
19✔
618
TEST_SECTION_REJECT("build", "exposeptr.o", ".text")
16✔
619
TEST_SECTION_REJECT("build", "exposeptr2.o", ".text")
16✔
620
TEST_SECTION_REJECT("build", "mapvalue-overrun.o", ".text")
16✔
621
TEST_SECTION_REJECT("build", "nullmapref.o", "test")
16✔
622
TEST_SECTION_REJECT("build", "packet_overflow.o", "xdp")
16✔
623
TEST_SECTION_REJECT("build", "packet_reallocate.o", "socket_filter")
16✔
624
TEST_SECTION_REJECT("build", "tail_call_bad.o", "xdp_prog")
16✔
625
TEST_SECTION_REJECT("build", "ringbuf_uninit.o", ".text");
16✔
626

627
// The following eBPF programs currently fail verification.
628
// If the verifier is later updated to accept them, these should
629
// be changed to TEST_SECTION().
630

631
// This fails due to correlated branches not being handled precisely enough,
632
// Unless the analysis tracks the correlation between shared_offset and the type of another register,
633
// which is probably arbitrary and brittle.
634
TEST_SECTION_FAIL("prototype-kernel", "xdp_ddos01_blacklist_kern.o", "xdp_prog")
19✔
635

636
// Unsupported: ebpf-function
637
TEST_SECTION_FAIL("prototype-kernel", "xdp_ddos01_blacklist_kern.o", ".text")
19✔
638

639
// Unsupported: implications are lost in correlated branches
640
TEST_SECTION_FAIL("cilium", "bpf_xdp_dsr_linux.o", "2/7")
19✔
641

642
// Failure: 166:168: Upper bound must be at most packet_size (valid_access(r4.offset, width=2) for read)
643
// This is the result of merging two branches, one with value 0 and another with value -22,
644
// then checking that the result is != 0. The minor issue is not handling the int32 comparison precisely enough.
645
// The bigger issue is that the convexity of the numerical domain means that precise handling would still get
646
// [-22, -1] which is not sufficient (at most -2 is needed)
647
TEST_SECTION_FAIL("cilium", "bpf_xdp_dsr_linux.o", "2/10")
19✔
648
TEST_SECTION_FAIL("cilium", "bpf_xdp_dsr_linux.o", "2/21")
19✔
649
TEST_SECTION_FAIL_SLOW("cilium", "bpf_xdp_dsr_linux.o", "2/24")
19✔
650

651
TEST_SECTION_FAIL_SLOW("cilium", "bpf_xdp_dsr_linux.o", "2/15")
19✔
652

653
TEST_SECTION_FAIL("cilium", "bpf_xdp_dsr_linux.o", "2/17")
19✔
654

655
// Failure: trying to access r4 where r4.packet_offset=[0, 255] and packet_size=[54, 65534]
656
// Root cause: r5.value=[0, 65535] 209: w5 >>= 8; clears r5 instead of yielding [0, 255]
657
TEST_SECTION_FAIL("cilium", "bpf_xdp_dsr_linux.o", "2/18")
19✔
658
TEST_SECTION_FAIL("cilium", "bpf_xdp_snat_linux.o", "2/10")
19✔
659
TEST_SECTION_FAIL("cilium", "bpf_xdp_snat_linux.o", "2/18")
19✔
660

661
TEST_SECTION_FAIL_SLOW("cilium", "bpf_xdp_dsr_linux.o", "2/19")
19✔
662

663
// Failure: 230: Upper bound must be at most packet_size (valid_access(r3.offset+32, width=8) for write)
664
// r3.packet_offset=[0, 82] and packet_size=[34, 65534]
665
// looks like a combination of misunderstanding the value passed to xdp_adjust_tail()
666
// which is "r7.value=[0, 82]; w7 -= r9;" where r9.value where "r7.value-r9.value<=48"
667
TEST_SECTION_FAIL("cilium", "bpf_xdp_dsr_linux.o", "2/20")
19✔
668

669
TEST_SECTION_FAIL("cilium", "bpf_xdp_snat_linux.o", "2/7")
19✔
670
TEST_SECTION_FAIL_SLOW("cilium", "bpf_xdp_snat_linux.o", "2/15")
19✔
671
TEST_SECTION_FAIL("cilium", "bpf_xdp_snat_linux.o", "2/17")
19✔
672
TEST_SECTION_FAIL_SLOW("cilium", "bpf_xdp_snat_linux.o", "2/19")
19✔
673

674
// Failure (&255): assert r5.type == number; w5 &= 255;
675
// fails since in one branch (77) r5 is a number but in another (92:93) it is a packet
676
TEST_SECTION_FAIL_SLOW("cilium", "bpf_xdp_snat_linux.o", "2/24")
19✔
677
// Failure (&255): assert r3.type == number; w3 &= 255;
678
TEST_SECTION_FAIL_SLOW("cilium", "bpf_xdp_dsr_linux.o", "2/16")
19✔
679
TEST_SECTION_FAIL_SLOW("cilium", "bpf_xdp_snat_linux.o", "2/16")
19✔
680

681
// False positive, unknown cause
682
TEST_SECTION_FAIL("linux", "test_map_in_map_kern.o", "kprobe/sys_connect")
19✔
683

684
TEST_SECTION_LEGACY("cilium", "bpf_netdev.o", "from-netdev")
33✔
685
TEST_SECTION_LEGACY_SLOW("bpf_cilium_test", "bpf_netdev.o", "from-netdev")
33✔
686
TEST_SECTION_SLOW("cilium", "bpf_lxc.o", "2/7")
16✔
687
TEST_SECTION_LEGACY_SLOW("cilium", "bpf_lxc.o", "2/10")
33✔
688
TEST_SECTION_SLOW("cilium", "bpf_lxc.o", "2/11")
16✔
689
TEST_SECTION_SLOW("cilium", "bpf_lxc.o", "2/12")
16✔
690

691
// cilium-core/bpf_host.o
692
TEST_PROGRAM_FAIL("cilium-core", "bpf_host.o", "tc/entry", "cil_from_netdev", 5)
20✔
693
TEST_PROGRAM_FAIL("cilium-core", "bpf_host.o", "tc/entry", "cil_from_host", 5)
22✔
694
TEST_PROGRAM_FAIL("cilium-core", "bpf_host.o", "tc/entry", "cil_to_netdev", 5)
24✔
695
// - cil_to_host: unsupported function: skc_lookup_tcp
696
TEST_PROGRAM_FAIL("cilium-core", "bpf_host.o", "tc/entry", "cil_host_policy", 5)
28✔
697

698
// cilium-core/bpf_lxc.o
699
TEST_PROGRAM("cilium-core", "bpf_lxc.o", "tc/entry", "cil_from_container", 4)
23✔
700
TEST_PROGRAM("cilium-core", "bpf_lxc.o", "tc/entry", "cil_lxc_policy", 4)
23✔
701
TEST_PROGRAM("cilium-core", "bpf_lxc.o", "tc/entry", "cil_lxc_policy_egress", 4)
23✔
702
TEST_PROGRAM("cilium-core", "bpf_lxc.o", "tc/entry", "cil_to_container", 4)
23✔
703

704
// cilium-core/bpf_network.o
705
TEST_SECTION("cilium-core", "bpf_network.o", "tc/entry")
16✔
706

707
// cilium-core/bpf_overlay.o
708
TEST_PROGRAM("cilium-core", "bpf_overlay.o", "tc/entry", "cil_from_overlay", 2)
19✔
709
// - cil_to_overlay: CRAB_ERROR("Bound: inf / inf")
710

711
// cilium-core/bpf_sock.o
712
TEST_SECTION("cilium-core", "bpf_sock.o", "cgroup/connect4")
16✔
713
TEST_SECTION("cilium-core", "bpf_sock.o", "cgroup/connect6")
16✔
714
TEST_SECTION("cilium-core", "bpf_sock.o", "cgroup/post_bind4")
16✔
715
TEST_SECTION("cilium-core", "bpf_sock.o", "cgroup/post_bind6")
16✔
716
TEST_SECTION("cilium-core", "bpf_sock.o", "cgroup/sendmsg4")
16✔
717
TEST_SECTION("cilium-core", "bpf_sock.o", "cgroup/sendmsg6")
16✔
718
TEST_SECTION("cilium-core", "bpf_sock.o", "cgroup/recvmsg4")
16✔
719
TEST_SECTION_FAIL("cilium-core", "bpf_sock.o", "cgroup/recvmsg6")
19✔
720
// - bpf_sock.o cgroup/sock_release: invalid helper function id 46
721

722
// cilium-core/bpf_wireguard.o
723
TEST_PROGRAM("cilium-core", "bpf_wireguard.o", "tc/entry", "cil_from_wireguard", 2)
19✔
724
TEST_PROGRAM("cilium-core", "bpf_wireguard.o", "tc/entry", "cil_to_wireguard", 2)
19✔
725

726
// cilium-core/bpf_xdp.o
727
TEST_SECTION_FAIL("cilium-core", "bpf_xdp.o", "xdp/entry")
19✔
728

729
// cilium-examples tests
730
TEST_SECTION("cilium-examples", "cgroup_skb_bpf_bpfel.o", "cgroup_skb/egress")
16✔
731
TEST_SECTION("cilium-examples", "kprobe_bpf_bpfel.o", "kprobe/sys_execve")
16✔
732
TEST_SECTION("cilium-examples", "kprobe_percpu_bpf_bpfel.o", "kprobe/sys_execve")
16✔
733
TEST_SECTION("cilium-examples", "kprobepin_bpf_bpfel.o", "kprobe/sys_execve")
16✔
734
TEST_SECTION("cilium-examples", "tracepoint_in_c_bpf_bpfel.o", "tracepoint/kmem/mm_page_alloc")
16✔
735
TEST_SECTION("cilium-examples", "xdp_bpf_bpfel.o", "xdp")
16✔
736
// This is TEST_SECTION_FAIL, but with a shorter filename to avoid CATCH2 test name limits.
737
TEST_CASE("expect failure cilium-examples/uretprobe_x86 uretprobe/bash_readline",
2✔
738
          "[!shouldfail][verify][samples][cilium-examples]") {
739
    VERIFY_SECTION("cilium-examples", "uretprobe_bpf_x86_bpfel.o", "uretprobe/bash_readline", {},
19✔
740
                   &g_ebpf_platform_linux, true);
UNCOV
741
}
×
742

743
TEST_PROGRAM("cilium-examples", "tcx_bpf_bpfel.o", "tc", "ingress_prog_func", 2)
19✔
744
TEST_PROGRAM("cilium-examples", "tcx_bpf_bpfel.o", "tc", "egress_prog_func", 2)
19✔
745

746
static void test_analyze_thread(const Program* prog, const ProgramInfo* info, bool* res) {
4✔
747
    thread_local_program_info.set(*info);
6✔
748
    *res = verify(*prog);
4✔
749
}
4✔
750

751
// Test multithreading
752
TEST_CASE("multithreading", "[verify][multithreading]") {
2✔
753
    auto raw_progs1 = read_elf("ebpf-samples/bpf_cilium_test/bpf_netdev.o", "2/1", "", {}, &g_ebpf_platform_linux);
8✔
754
    REQUIRE(raw_progs1.size() == 1);
2✔
755
    RawProgram raw_prog1 = raw_progs1.back();
2✔
756
    auto prog_or_error1 = unmarshal(raw_prog1, {});
2✔
757
    auto inst_seq1 = std::get_if<InstructionSeq>(&prog_or_error1);
2✔
758
    REQUIRE(inst_seq1);
2✔
759
    const Program prog1 = Program::from_sequence(*inst_seq1, raw_prog1.info, {});
2✔
760

761
    auto raw_progs2 = read_elf("ebpf-samples/bpf_cilium_test/bpf_netdev.o", "2/2", "", {}, &g_ebpf_platform_linux);
8✔
762
    REQUIRE(raw_progs2.size() == 1);
2✔
763
    RawProgram raw_prog2 = raw_progs2.back();
2✔
764
    auto prog_or_error2 = unmarshal(raw_prog2, {});
2✔
765
    auto inst_seq2 = std::get_if<InstructionSeq>(&prog_or_error2);
2✔
766
    REQUIRE(inst_seq2);
2✔
767
    const Program prog2 = Program::from_sequence(*inst_seq2, raw_prog2.info, {});
2✔
768

769
    bool res1, res2;
1✔
770
    std::thread a(test_analyze_thread, &prog1, &raw_prog1.info, &res1);
2✔
771
    std::thread b(test_analyze_thread, &prog2, &raw_prog2.info, &res2);
2✔
772
    a.join();
2✔
773
    b.join();
2✔
774

775
    REQUIRE(res1);
2✔
776
    REQUIRE(res2);
3✔
777
}
2✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc