mirror of
https://github.com/openharmony/third_party_libabigail.git
synced 2026-07-01 06:09:52 -04:00
58488c5f31
This patch replaces license headers with SPDX identifiers in all files containing license headers. For each file, the SPDX identifier formally represents its current license. Note that the list of SPDX identifiers is available on the SPDX web site at https://spdx.org/licenses. For autoconf-archive/ax_prog_python_version.m4 however, there is a little catch. Dodji Seketeli wrote this ax_check_python_modules.m4. Just like the other autoconf-archive macros, it makes sense to have it under the FSF All Permissive license. Actually, the terms of that license was already in the file but then the license header was wrongly set to GPLv2 with autoconf exception. So I fixed that in this commit by setting the SPDX identifier to FSFAP. * abigail.m4: Replace the license header with the SPDX identifier GPL-3.0-or-later WITH GCC-exception-3.1 * autoconf-archive/ax_check_python_modules.m4: Correctly set the SPDX identifier to FSFAP. * autoconf-archive/ax_compare_version.m4: Replace the license header with the SPDX identifier FSFAP. * autoconf-archive/ax_prog_python_version.m4: Likewise. header with the SPDX identifier FSFAP. * autoconf-archive/ax_valgrind_check.m4: Likewise. * gen-changelog.py: Replace the license header with the SPDX identifier LGPL-2.0-or-later. * include/abg-comp-filter.h: Replace the license header with the SPDX identifier LGPL-3.0-or-later. * include/abg-comparison.h: Likewise. * include/abg-config.h: Likewise. * include/abg-corpus.h: Likewise. * include/abg-cxx-compat.h: Replace the license header with the SPDX identifier LGPL-2.0-or-later. * include/abg-diff-utils.h: Replace the license header with the SPDX identifier LGPL-3.0-or-later * include/abg-dwarf-reader.h: Likewise. * include/abg-fwd.h: Likewise. * include/abg-hash.h: Likewise. * include/abg-ini.h: Likewise. * include/abg-interned-str.h: Likewise. * include/abg-ir.h: Likewise. * include/abg-libxml-utils.h: Likewise. * include/abg-libzip-utils.h: Likewise. * include/abg-reader.h: Likewise. * include/abg-regex.h: Likewise. * include/abg-reporter.h: Likewise. * include/abg-sptr-utils.h: Likewise. * include/abg-suppression.h: Likewise. * include/abg-tools-utils.h: Likewise. * include/abg-traverse.h: Likewise. * include/abg-viz-common.h: Likewise. * include/abg-viz-dot.h: Likewise. * include/abg-viz-svg.h: Likewise. * include/abg-workers.h: Likewise. * include/abg-writer.h: Likewise. * install-sh: Replace the license header with the SPDX identifier MIT. * ltmain.sh: Replace the license header with the SPDX identifier GPL-2.0-or-later. Note that this file has the libtool special exception which allows us to redistribute it under the general license of the project. * src/abg-comp-filter.cc: Replace the license header with the SPDX * src/abg-comparison-priv.h: Likewise. * src/abg-comparison.cc: Likewise. * src/abg-config.cc: Likewise. * src/abg-corpus-priv.h: Likewise. * src/abg-corpus.cc: Likewise. * src/abg-default-reporter.cc: Likewise. * src/abg-diff-utils.cc: Likewise. * src/abg-dwarf-reader.cc: Likewise. * src/abg-elf-helpers.cc: Likewise. * src/abg-elf-helpers.h: Likewise. * src/abg-regex.cc: Likewise. * src/abg-hash.cc: Likewise. * src/abg-ini.cc: Likewise. * src/abg-internal.h: Likewise. * src/abg-ir-priv.h: Likewise. * src/abg-ir.cc: Likewise. * src/abg-leaf-reporter.cc: Likewise. * src/abg-libxml-utils.cc: Likewise. * src/abg-libzip-utils.cc: Likewise. * src/abg-reader.cc: Likewise. * src/abg-reporter-priv.cc: Likewise. * src/abg-reporter-priv.h: Likewise. * src/abg-sptr-utils.cc: Likewise. * src/abg-suppression-priv.h: Likewise. * src/abg-suppression.cc: Likewise. * src/abg-tools-utils.cc: Likewise. * src/abg-traverse.cc: Likewise. * src/abg-viz-common.cc: Likewise. * src/abg-viz-dot.cc: Likewise. * src/abg-viz-svg.cc: Likewise. * src/abg-workers.cc: Likewise. * src/abg-writer.cc: Likewise. * tests/lib/catch.cc: Likewise. * tests/lib/catch.hpp: Add an SPDX identifier BSL-1.0. * tests/mockfedabipkgdiff.in: Replace the license header with the SPDX identifier GPL-3.0-or-later. * tests/print-diff-tree.cc: Likewise. * tests/runtestfedabipkgdiff.py.in: Replaace the license header with the SPDW identifier GPL-3.0-or-later. * tests/test-abicompat.cc: Replace the license header with the SPDX identifier LGPL-3.0-or-later. * tests/test-abidiff-exit.cc: Likewise. * tests/test-abidiff.cc: Likewise. * tests/test-alt-dwarf-file.cc: Likewise. * tests/test-annotate.cc: Likewise. * tests/test-cxx-compat.cc: Likewise. * tests/test-core-diff.cc: Likewise. * tests/test-diff-dwarf-abixml.cc: Likewise. * tests/test-diff-dwarf.cc: Likewise. * tests/test-diff-filter.cc: Likewise. * tests/test-diff-pkg.cc: Likewise. * tests/test-diff-suppr.cc: Likewise. * tests/test-diff2.cc: Likewise. * tests/test-dot.cc: Replace the license header with the SPDX identifier GPL-3.0-with-GCC-exception. * tests/test-elf-helpers.cc: Replace the license header with the SPDX identifier LGPL-3.0-or-later. * tests/test-ini.cc: Likewise. * tests/test-ir-walker.cc: Likewise. * tests/test-kmi-whitelist.cc: Likewise. * tests/test-lookup-syms.cc: Likewise. * tests/test-read-dwarf.cc: Likewise. * tests/test-read-write.cc: Likewise. * tests/test-svg.cc: Replace the license header with the SPDX identifier GPL-3.0-with-GCC-exception. * tests/test-symtab.cc: Replace the license header with the SPDX identifier LGPL-3.0-or-later. * tests/test-tools-utils.cc: Likewise. * tests/test-types-stability.cc: Likewise. * tests/test-utils.cc: Likewise. * tests/test-utils.h: Likewise. * tests/test-write-read-archive.cc: Likewise. * tools/abiar.cc: Likewise. * tools/abicompat.cc: Likewise. * tools/abidiff.cc: Likewise. * tools/abidw.cc: Likewise. * tools/abilint.cc: Likewise. * tools/abipkgdiff.cc: Likewise. * tools/abisym.cc: Likewise. * tools/binilint.cc: Likewise. * tools/fedabipkgdiff: Replace the license header with the SPDX identifier GPL-3.0-or-later. * tools/kmidiff.cc: Likewise. Signed-off-by: Benjamin De Kosnik <bkoz@gnu.org> Signed-off-by: Ben Woodard <woodard@redhat.com> Signed-off-by: Chenxiong Qi <cqi@redhat.com> Signed-off-by: Dodji Seketeli <dodji@redhat.com> Signed-off-by: Giuliano Procida <gprocida@google.com> Signed-off-by: Jan Engelhardt <jengelh@inai.de> Signed-off-by: Jessica Yu <jeyu@kernel.org> Signed-off-by: Jonathan Wakely <jwakely@redhat.com> Signed-off-by: Mark Wielaard <mark@klomp.org> Signed-off-by: Matthias Klose <doko@ubuntu.com> Signed-off-by: Matthias Maennich <maennich@google.com> Signed-off-by: Ondrej Oprala <ondrej.oprala@gmail.com> Signed-off-by: Roland McGrath <roland@hack.frob.com> Signed-off-by: Sinny Kumari <ksinny@gmail.com> Signed-off-by: Slava Barinov <v.barinov@samsung.com>
279 lines
9.7 KiB
C++
279 lines
9.7 KiB
C++
// SPDX-License-Identifier: LGPL-3.0-or-later
|
|
// -*- Mode: C++ -*-
|
|
//
|
|
// Copyright (C) 2020 Google, Inc.
|
|
//
|
|
// Author: Matthias Maennich
|
|
|
|
/// @file
|
|
///
|
|
/// This program tests symtab invariants through abg-corpus.
|
|
|
|
#include <iostream>
|
|
#include <limits>
|
|
#include <vector>
|
|
|
|
#include "abg-corpus.h"
|
|
#include "abg-dwarf-reader.h"
|
|
#include "abg-ir.h"
|
|
#include "lib/catch.hpp"
|
|
#include "test-utils.h"
|
|
|
|
using namespace abigail;
|
|
|
|
using dwarf_reader::create_read_context;
|
|
using dwarf_reader::read_context_sptr;
|
|
using dwarf_reader::read_corpus_from_elf;
|
|
using ir::environment;
|
|
using ir::environment_sptr;
|
|
|
|
static const std::string test_data_dir =
|
|
std::string(abigail::tests::get_src_dir()) + "/tests/data/test-symtab/";
|
|
|
|
dwarf_reader::status
|
|
read_corpus(const std::string path, corpus_sptr& result)
|
|
{
|
|
const std::string& absolute_path = test_data_dir + path;
|
|
|
|
environment_sptr env(new environment);
|
|
const std::vector<char**> debug_info_root_paths;
|
|
read_context_sptr ctxt = create_read_context(
|
|
absolute_path, debug_info_root_paths, env.get(),
|
|
/* load_all_type = */ true, /* linux_kernel_mode = */ true);
|
|
|
|
dwarf_reader::status status = dwarf_reader::STATUS_UNKNOWN;
|
|
result = read_corpus_from_elf(*ctxt, status);
|
|
|
|
REQUIRE(status != dwarf_reader::STATUS_UNKNOWN);
|
|
return status;
|
|
}
|
|
|
|
TEST_CASE("Symtab::Empty", "[symtab, basic]")
|
|
{
|
|
const std::string binary = "basic/empty.so";
|
|
corpus_sptr corpus_ptr;
|
|
const dwarf_reader::status status = read_corpus(binary, corpus_ptr);
|
|
REQUIRE(corpus_ptr);
|
|
|
|
REQUIRE((status & dwarf_reader::STATUS_OK));
|
|
|
|
// TODO: Those two assertions are currently not met. Empty symtabs are
|
|
// currently treated like the error case.
|
|
// REQUIRE((status & dwarf_reader::STATUS_OK));
|
|
// REQUIRE((status & dwarf_reader::STATUS_NO_SYMBOLS_FOUND));
|
|
}
|
|
|
|
TEST_CASE("Symtab::NoDebugInfo", "[symtab, basic]")
|
|
{
|
|
const std::string binary = "basic/no_debug_info.so";
|
|
corpus_sptr corpus_ptr;
|
|
const dwarf_reader::status status = read_corpus(binary, corpus_ptr);
|
|
REQUIRE(corpus_ptr);
|
|
|
|
REQUIRE(status
|
|
== (dwarf_reader::STATUS_OK
|
|
| dwarf_reader::STATUS_DEBUG_INFO_NOT_FOUND));
|
|
}
|
|
|
|
// this value indicates in the following helper method, that we do not want to
|
|
// assert for this particular value. In other words, N is a placeholder for an
|
|
// arbitrary value.
|
|
#define N std::numeric_limits<size_t>::max()
|
|
|
|
corpus_sptr
|
|
assert_symbol_count(const std::string& path,
|
|
size_t function_symbols = 0,
|
|
size_t variable_symbols = 0,
|
|
size_t undefined_function_symbols = 0,
|
|
size_t undefined_variable_symbols = 0)
|
|
{
|
|
corpus_sptr corpus_ptr;
|
|
const dwarf_reader::status status = read_corpus(path, corpus_ptr);
|
|
REQUIRE(corpus_ptr);
|
|
|
|
REQUIRE((status & dwarf_reader::STATUS_OK));
|
|
const corpus& corpus = *corpus_ptr;
|
|
|
|
if (function_symbols != N)
|
|
{
|
|
CHECK(corpus.get_sorted_fun_symbols().size() == function_symbols);
|
|
CHECK(corpus.get_fun_symbol_map().size() == function_symbols);
|
|
CHECK(corpus.get_fun_symbol_map_sptr()->size() == function_symbols);
|
|
}
|
|
if (variable_symbols != N)
|
|
{
|
|
CHECK(corpus.get_sorted_var_symbols().size() == variable_symbols);
|
|
CHECK(corpus.get_var_symbol_map().size() == variable_symbols);
|
|
CHECK(corpus.get_var_symbol_map_sptr()->size() == variable_symbols);
|
|
}
|
|
if (undefined_variable_symbols != N)
|
|
{
|
|
CHECK(corpus.get_sorted_undefined_fun_symbols().size()
|
|
== undefined_function_symbols);
|
|
CHECK(corpus.get_undefined_fun_symbol_map().size()
|
|
== undefined_function_symbols);
|
|
CHECK(corpus.get_undefined_fun_symbol_map_sptr()->size()
|
|
== undefined_function_symbols);
|
|
}
|
|
if (undefined_function_symbols != N)
|
|
{
|
|
CHECK(corpus.get_sorted_undefined_var_symbols().size()
|
|
== undefined_variable_symbols);
|
|
CHECK(corpus.get_undefined_var_symbol_map().size()
|
|
== undefined_variable_symbols);
|
|
CHECK(corpus.get_undefined_var_symbol_map_sptr()->size()
|
|
== undefined_variable_symbols);
|
|
}
|
|
|
|
return corpus_ptr;
|
|
}
|
|
|
|
TEST_CASE("Symtab::SimpleSymtabs", "[symtab, basic]")
|
|
{
|
|
GIVEN("a binary with no exported symbols")
|
|
{
|
|
// TODO: should pass, but does currently not as empty tables are treated
|
|
// like the error case, but this is an edge case anyway.
|
|
// assert_symbol_count("empty.so");
|
|
}
|
|
|
|
GIVEN("a binary with a single exported function")
|
|
{
|
|
const std::string binary = "basic/single_function.so";
|
|
const corpus_sptr& corpus = assert_symbol_count(binary, 1, 0);
|
|
const elf_symbol_sptr& symbol =
|
|
corpus->lookup_function_symbol("exported_function");
|
|
REQUIRE(symbol);
|
|
CHECK(!corpus->lookup_variable_symbol("exported_function"));
|
|
CHECK(symbol == corpus->lookup_function_symbol(*symbol));
|
|
CHECK(symbol != corpus->lookup_variable_symbol(*symbol));
|
|
}
|
|
|
|
GIVEN("a binary with a single exported variable")
|
|
{
|
|
const std::string binary = "basic/single_variable.so";
|
|
const corpus_sptr& corpus = assert_symbol_count(binary, 0, 1);
|
|
const elf_symbol_sptr& symbol =
|
|
corpus->lookup_variable_symbol("exported_variable");
|
|
REQUIRE(symbol);
|
|
CHECK(!corpus->lookup_function_symbol("exported_variable"));
|
|
CHECK(symbol == corpus->lookup_variable_symbol(*symbol));
|
|
CHECK(symbol != corpus->lookup_function_symbol(*symbol));
|
|
}
|
|
|
|
GIVEN("a binary with one function and one variable exported")
|
|
{
|
|
const std::string binary = "basic/one_function_one_variable.so";
|
|
const corpus_sptr& corpus = assert_symbol_count(binary, 1, 1);
|
|
CHECK(corpus->lookup_function_symbol("exported_function"));
|
|
CHECK(!corpus->lookup_variable_symbol("exported_function"));
|
|
CHECK(corpus->lookup_variable_symbol("exported_variable"));
|
|
CHECK(!corpus->lookup_function_symbol("exported_variable"));
|
|
}
|
|
|
|
GIVEN("a binary with a single undefined function")
|
|
{
|
|
const std::string binary = "basic/single_undefined_function.so";
|
|
const corpus_sptr& corpus = assert_symbol_count(binary, 0, 0, 1, 0);
|
|
}
|
|
|
|
GIVEN("a binary with a single undefined variable")
|
|
{
|
|
const std::string binary = "basic/single_undefined_variable.so";
|
|
const corpus_sptr& corpus = assert_symbol_count(binary, 0, 0, 0, 1);
|
|
}
|
|
|
|
GIVEN("a binary with one function and one variable undefined")
|
|
{
|
|
const std::string binary = "basic/one_function_one_variable_undefined.so";
|
|
const corpus_sptr& corpus = assert_symbol_count(binary, 0, 0, 1, 1);
|
|
}
|
|
}
|
|
|
|
static const char* kernel_versions[] = { "4.14", "4.19", "5.4", "5.6" };
|
|
static const size_t nr_kernel_versions =
|
|
sizeof(kernel_versions) / sizeof(kernel_versions[0]);
|
|
|
|
TEST_CASE("Symtab::SimpleKernelSymtabs", "[symtab, basic, kernel, ksymtab]")
|
|
{
|
|
for (size_t i = 0; i < nr_kernel_versions; ++i)
|
|
{
|
|
const std::string base_path =
|
|
"kernel-" + std::string(kernel_versions[i]) + "/";
|
|
|
|
GIVEN("The binaries in " + base_path)
|
|
{
|
|
|
|
GIVEN("a kernel module with no exported symbols")
|
|
{
|
|
// TODO: should pass, but does currently not as empty tables are
|
|
// treated
|
|
// like the error case, but this is an edge case anyway.
|
|
// assert_symbol_count(base_path + "empty.so");
|
|
}
|
|
|
|
GIVEN("a kernel module with a single exported function")
|
|
{
|
|
const std::string binary = base_path + "single_function.ko";
|
|
const corpus_sptr& corpus = assert_symbol_count(binary, 1, 0);
|
|
const elf_symbol_sptr& symbol =
|
|
corpus->lookup_function_symbol("exported_function");
|
|
REQUIRE(symbol);
|
|
CHECK(!corpus->lookup_variable_symbol("exported_function"));
|
|
CHECK(symbol == corpus->lookup_function_symbol(*symbol));
|
|
CHECK(symbol != corpus->lookup_variable_symbol(*symbol));
|
|
}
|
|
|
|
GIVEN("a kernel module with a single GPL exported function")
|
|
{
|
|
const std::string binary = base_path + "single_function_gpl.ko";
|
|
const corpus_sptr& corpus = assert_symbol_count(binary, 1, 0);
|
|
const elf_symbol_sptr& symbol =
|
|
corpus->lookup_function_symbol("exported_function_gpl");
|
|
REQUIRE(symbol);
|
|
CHECK(!corpus->lookup_variable_symbol("exported_function_gpl"));
|
|
CHECK(symbol == corpus->lookup_function_symbol(*symbol));
|
|
CHECK(symbol != corpus->lookup_variable_symbol(*symbol));
|
|
}
|
|
|
|
GIVEN("a binary with a single exported variable")
|
|
{
|
|
const std::string binary = base_path + "single_variable.ko";
|
|
const corpus_sptr& corpus = assert_symbol_count(binary, 0, 1);
|
|
const elf_symbol_sptr& symbol =
|
|
corpus->lookup_variable_symbol("exported_variable");
|
|
REQUIRE(symbol);
|
|
CHECK(!corpus->lookup_function_symbol("exported_variable"));
|
|
CHECK(symbol == corpus->lookup_variable_symbol(*symbol));
|
|
CHECK(symbol != corpus->lookup_function_symbol(*symbol));
|
|
}
|
|
|
|
GIVEN("a binary with a single GPL exported variable")
|
|
{
|
|
const std::string binary = base_path + "single_variable_gpl.ko";
|
|
const corpus_sptr& corpus = assert_symbol_count(binary, 0, 1);
|
|
const elf_symbol_sptr& symbol =
|
|
corpus->lookup_variable_symbol("exported_variable_gpl");
|
|
REQUIRE(symbol);
|
|
CHECK(!corpus->lookup_function_symbol("exported_variable_gpl"));
|
|
CHECK(symbol == corpus->lookup_variable_symbol(*symbol));
|
|
CHECK(symbol != corpus->lookup_function_symbol(*symbol));
|
|
}
|
|
|
|
GIVEN("a binary with one function and one variable (GPL) exported")
|
|
{
|
|
const std::string binary = base_path + "one_of_each.ko";
|
|
const corpus_sptr& corpus = assert_symbol_count(binary, 2, 2);
|
|
CHECK(corpus->lookup_function_symbol("exported_function"));
|
|
CHECK(!corpus->lookup_variable_symbol("exported_function"));
|
|
CHECK(corpus->lookup_function_symbol("exported_function_gpl"));
|
|
CHECK(!corpus->lookup_variable_symbol("exported_function_gpl"));
|
|
CHECK(corpus->lookup_variable_symbol("exported_variable"));
|
|
CHECK(!corpus->lookup_function_symbol("exported_variable"));
|
|
CHECK(corpus->lookup_variable_symbol("exported_variable_gpl"));
|
|
CHECK(!corpus->lookup_function_symbol("exported_variable_gpl"));
|
|
}
|
|
}
|
|
}
|
|
}
|