]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/bpf: Fix RELEASE build failure with gcc14
authorYonghong Song <yonghong.song@linux.dev>
Tue, 17 Jun 2025 04:49:56 +0000 (21:49 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 17 Jun 2025 17:18:30 +0000 (10:18 -0700)
With gcc14, when building with RELEASE=1, I hit four below compilation
failure:

Error 1:
  In file included from test_loader.c:6:
  test_loader.c: In function ‘run_subtest’: test_progs.h:194:17:
      error: ‘retval’ may be used uninitialized in this function
   [-Werror=maybe-uninitialized]
    194 |                 fprintf(stdout, ##format);           \
        |                 ^~~~~~~
  test_loader.c:958:13: note: ‘retval’ was declared here
    958 |         int retval, err, i;
        |             ^~~~~~

  The uninitialized var 'retval' actually could cause incorrect result.

Error 2:
  In function ‘test_fd_array_cnt’:
  prog_tests/fd_array.c:71:14: error: ‘btf_id’ may be used uninitialized in this
      function [-Werror=maybe-uninitialized]
     71 |         fd = bpf_btf_get_fd_by_id(id);
        |              ^~~~~~~~~~~~~~~~~~~~~~~~
  prog_tests/fd_array.c:302:15: note: ‘btf_id’ was declared here
    302 |         __u32 btf_id;
        |               ^~~~~~

  Changing ASSERT_GE to ASSERT_EQ can fix the compilation error. Otherwise,
  there is no functionality change.

Error 3:
  prog_tests/tailcalls.c: In function ‘test_tailcall_hierarchy_count’:
  prog_tests/tailcalls.c:1402:23: error: ‘fentry_data_fd’ may be used uninitialized
      in this function [-Werror=maybe-uninitialized]
     1402 |                 err = bpf_map_lookup_elem(fentry_data_fd, &i, &val);
          |                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  The code is correct. The change intends to silence gcc errors.

Error 4: (this error only happens on arm64)
  In file included from prog_tests/log_buf.c:4:
  prog_tests/log_buf.c: In function ‘bpf_prog_load_log_buf’:
  ./test_progs.h:390:22: error: ‘log_buf’ may be used uninitialized [-Werror=maybe-uninitialized]
    390 |         int ___err = libbpf_get_error(___res);             \
        |                      ^~~~~~~~~~~~~~~~~~~~~~~~
  prog_tests/log_buf.c:158:14: note: in expansion of macro ‘ASSERT_OK_PTR’
    158 |         if (!ASSERT_OK_PTR(log_buf, "log_buf_alloc"))
        |              ^~~~~~~~~~~~~
  In file included from selftests/bpf/tools/include/bpf/bpf.h:32,
                 from ./test_progs.h:36:
  selftests/bpf/tools/include/bpf/libbpf_legacy.h:113:17:
    note: by argument 1 of type ‘const void *’ to ‘libbpf_get_error’ declared here
    113 | LIBBPF_API long libbpf_get_error(const void *ptr);
        |                 ^~~~~~~~~~~~~~~~

  Adding a pragma to disable maybe-uninitialized fixed the issue.

Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/r/20250617044956.2686668-1-yonghong.song@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/prog_tests/fd_array.c
tools/testing/selftests/bpf/prog_tests/log_buf.c
tools/testing/selftests/bpf/prog_tests/tailcalls.c
tools/testing/selftests/bpf/test_loader.c

index 9add890c2d37257eb2a8542d1363765996edef71..241b2c8c6e0f152bbc24e67094320cefb3b32474 100644 (file)
@@ -312,7 +312,7 @@ static void check_fd_array_cnt__referenced_btfs(void)
 
        /* btf should still exist when original file descriptor is closed */
        err = get_btf_id_by_fd(extra_fds[0], &btf_id);
-       if (!ASSERT_GE(err, 0, "get_btf_id_by_fd"))
+       if (!ASSERT_EQ(err, 0, "get_btf_id_by_fd"))
                goto cleanup;
 
        Close(extra_fds[0]);
index 169ce689b97c67ca342e8d2e3647d172b7182587..d6f14a2320025aa7a2c24790bb8cdc65b95c151e 100644 (file)
@@ -7,6 +7,10 @@
 #include "test_log_buf.skel.h"
 #include "bpf_util.h"
 
+#if !defined(__clang__)
+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
+#endif
+
 static size_t libbpf_log_pos;
 static char libbpf_log_buf[1024 * 1024];
 static bool libbpf_log_error;
index 66a900327f912d9c1f78f1a95f78cd95bc17a4ab..0ab36503c3b213fbcbc5b0792c4011cecba2895e 100644 (file)
@@ -1195,7 +1195,7 @@ static void test_tailcall_hierarchy_count(const char *which, bool test_fentry,
                                          bool test_fexit,
                                          bool test_fentry_entry)
 {
-       int err, map_fd, prog_fd, main_data_fd, fentry_data_fd, fexit_data_fd, i, val;
+       int err, map_fd, prog_fd, main_data_fd, fentry_data_fd = 0, fexit_data_fd = 0, i, val;
        struct bpf_object *obj = NULL, *fentry_obj = NULL, *fexit_obj = NULL;
        struct bpf_link *fentry_link = NULL, *fexit_link = NULL;
        struct bpf_program *prog, *fentry_prog;
index 9551d8d5f8f9f817c6896f2a8f801a89666a395f..2c7e9729d5feb59f708591c57d065c1a5a316713 100644 (file)
@@ -1103,9 +1103,9 @@ void run_subtest(struct test_loader *tester,
                        }
                }
 
-               do_prog_test_run(bpf_program__fd(tprog), &retval,
-                                bpf_program__type(tprog) == BPF_PROG_TYPE_SYSCALL ? true : false);
-               if (retval != subspec->retval && subspec->retval != POINTER_VALUE) {
+               err = do_prog_test_run(bpf_program__fd(tprog), &retval,
+                                      bpf_program__type(tprog) == BPF_PROG_TYPE_SYSCALL ? true : false);
+               if (!err && retval != subspec->retval && subspec->retval != POINTER_VALUE) {
                        PRINT_FAIL("Unexpected retval: %d != %d\n", retval, subspec->retval);
                        goto tobj_cleanup;
                }