Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/tools/testing/selftests/bpf/prog_tests/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 5 kB image not shown  

Quelle  log_fixup.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */
#include <test_progs.h>
#include <bpf/btf.h>

#include "test_log_fixup.skel.h"

enum trunc_type {
 TRUNC_NONE,
 TRUNC_PARTIAL,
 TRUNC_FULL,
};

static void bad_core_relo(size_t log_buf_size, enum trunc_type trunc_type)
{
 char log_buf[8 * 1024];
 struct test_log_fixup* skel;
 int err;

 skel = test_log_fixup__open();
 if (!ASSERT_OK_PTR(skel, "skel_open"))
  return;

 bpf_program__set_autoload(skel->progs.bad_relo, true);
 memset(log_buf, 0, sizeof(log_buf));
 bpf_program__set_log_buf(skel->progs.bad_relo, log_buf, log_buf_size ?: sizeof(log_buf));
 bpf_program__set_log_level(skel->progs.bad_relo, 1 | 8); /* BPF_LOG_FIXED to force truncation */

 err = test_log_fixup__load(skel);
 if (!ASSERT_ERR(err, "load_fail"))
  goto cleanup;

 ASSERT_HAS_SUBSTR(log_buf,
     "0: \n"
     "failed to resolve CO-RE relocation ",
     "log_buf_part1");

 switch (trunc_type) {
 case TRUNC_NONE:
  ASSERT_HAS_SUBSTR(log_buf,
      "struct task_struct___bad.fake_field (0:1 @ offset 4)\n",
      "log_buf_part2");
  ASSERT_HAS_SUBSTR(log_buf,
      "max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0\n",
      "log_buf_end");
  break;
 case TRUNC_PARTIAL:
  /* we should get full libbpf message patch */
  ASSERT_HAS_SUBSTR(log_buf,
      "struct task_struct___bad.fake_field (0:1 @ offset 4)\n",
      "log_buf_part2");
  /* we shouldn't get full end of BPF verifier log */
  ASSERT_NULL(strstr(log_buf, "max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0\n"),
       "log_buf_end");
  break;
 case TRUNC_FULL:
  /* we shouldn't get second part of libbpf message patch */
  ASSERT_NULL(strstr(log_buf, "struct task_struct___bad.fake_field (0:1 @ offset 4)\n"),
       "log_buf_part2");
  /* we shouldn't get full end of BPF verifier log */
  ASSERT_NULL(strstr(log_buf, "max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0\n"),
       "log_buf_end");
  break;
 }

 if (env.verbosity > VERBOSE_NONE)
  printf("LOG: \n=================\n%s=================\n", log_buf);
cleanup:
 test_log_fixup__destroy(skel);
}

static void bad_core_relo_subprog(void)
{
 char log_buf[8 * 1024];
 struct test_log_fixup* skel;
 int err;

 skel = test_log_fixup__open();
 if (!ASSERT_OK_PTR(skel, "skel_open"))
  return;

 bpf_program__set_autoload(skel->progs.bad_relo_subprog, true);
 bpf_program__set_log_buf(skel->progs.bad_relo_subprog, log_buf, sizeof(log_buf));

 err = test_log_fixup__load(skel);
 if (!ASSERT_ERR(err, "load_fail"))
  goto cleanup;

 ASSERT_HAS_SUBSTR(log_buf,
     ": \n"
     "failed to resolve CO-RE relocation ",
     "log_buf");
 ASSERT_HAS_SUBSTR(log_buf,
     "struct task_struct___bad.fake_field_subprog (0:2 @ offset 8)\n",
     "log_buf");

 if (env.verbosity > VERBOSE_NONE)
  printf("LOG: \n=================\n%s=================\n", log_buf);

cleanup:
 test_log_fixup__destroy(skel);
}

static void missing_map(void)
{
 char log_buf[8 * 1024];
 struct test_log_fixup* skel;
 int err;

 skel = test_log_fixup__open();
 if (!ASSERT_OK_PTR(skel, "skel_open"))
  return;

 bpf_map__set_autocreate(skel->maps.missing_map, false);

 bpf_program__set_autoload(skel->progs.use_missing_map, true);
 bpf_program__set_log_buf(skel->progs.use_missing_map, log_buf, sizeof(log_buf));

 err = test_log_fixup__load(skel);
 if (!ASSERT_ERR(err, "load_fail"))
  goto cleanup;

 ASSERT_TRUE(bpf_map__autocreate(skel->maps.existing_map), "existing_map_autocreate");
 ASSERT_FALSE(bpf_map__autocreate(skel->maps.missing_map), "missing_map_autocreate");

 ASSERT_HAS_SUBSTR(log_buf,
     ": \n"
     "BPF map 'missing_map' is referenced but wasn't created\n",
     "log_buf");

 if (env.verbosity > VERBOSE_NONE)
  printf("LOG: \n=================\n%s=================\n", log_buf);

cleanup:
 test_log_fixup__destroy(skel);
}

static void missing_kfunc(void)
{
 char log_buf[8 * 1024];
 struct test_log_fixup* skel;
 int err;

 skel = test_log_fixup__open();
 if (!ASSERT_OK_PTR(skel, "skel_open"))
  return;

 bpf_program__set_autoload(skel->progs.use_missing_kfunc, true);
 bpf_program__set_log_buf(skel->progs.use_missing_kfunc, log_buf, sizeof(log_buf));

 err = test_log_fixup__load(skel);
 if (!ASSERT_ERR(err, "load_fail"))
  goto cleanup;

 ASSERT_HAS_SUBSTR(log_buf,
     "0: \n"
     "kfunc 'bpf_nonexistent_kfunc' is referenced but wasn't resolved\n",
     "log_buf");

 if (env.verbosity > VERBOSE_NONE)
  printf("LOG: \n=================\n%s=================\n", log_buf);

cleanup:
 test_log_fixup__destroy(skel);
}

void test_log_fixup(void)
{
 if (test__start_subtest("bad_core_relo_trunc_none"))
  bad_core_relo(0, TRUNC_NONE /* full buf */);
 if (test__start_subtest("bad_core_relo_trunc_partial"))
  bad_core_relo(300, TRUNC_PARTIAL /* truncate original log a bit */);
 if (test__start_subtest("bad_core_relo_trunc_full"))
  bad_core_relo(240, TRUNC_FULL  /* truncate also libbpf's message patch */);
 if (test__start_subtest("bad_core_relo_subprog"))
  bad_core_relo_subprog();
 if (test__start_subtest("missing_map"))
  missing_map();
 if (test__start_subtest("missing_kfunc"))
  missing_kfunc();
}

Messung V0.5
C=94 H=92 G=92

¤ Dauer der Verarbeitung: 0.3 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.