From patchwork Fri Jul 3 16:46:51 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Matthias_M=C3=A4nnich?= X-Patchwork-Id: 39902 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 26B84384402F; Fri, 3 Jul 2020 16:48:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 26B84384402F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1593794906; bh=OqMt+iDuVHoegHfcT/smmPCupgpEE1m6Xqnt87GLmSw=; h=Date:In-Reply-To:References:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:Cc:From; b=adKAJZUpGbQgS2V52ijuygFqAt0dDUwAu0ScxazTuBXPHxw65AKKw5PFJlH+zd3uy SPNEF1vCUv/esSa8qZVG8LHy216OkDDu9rVIp3ooHHnRjb6Tu/Bg8XYtM8H1MbPEOT P9P9lFfpe5pqF81zYSOtCcZeqlo+ba4wVdjom4qs= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from mail-ed1-x549.google.com (mail-ed1-x549.google.com [IPv6:2a00:1450:4864:20::549]) by sourceware.org (Postfix) with ESMTPS id 80F6E384402F for ; Fri, 3 Jul 2020 16:48:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 80F6E384402F Received: by mail-ed1-x549.google.com with SMTP id 64so35008182edf.2 for ; Fri, 03 Jul 2020 09:48:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=OqMt+iDuVHoegHfcT/smmPCupgpEE1m6Xqnt87GLmSw=; b=PYnOoO4qb7yzpojPY3BM1TUV87w5q1+eAnz/sheEwHYhBMVGrxwFImbTTFa/sJojno oxs+hh/7on48/atNKz6sSnT8KzxZS4h4yEcoqDLk5Zr30DN4B2gyT0IN8QDD+v/lQfYx 2d2xKrYN7lgijzacPy5Y1P6A/MWNqJypi8pw+KCUXqbXkNUSQp8AKQVNc9XKqwaRozNf czlDA+TMOftGwQaIlo6sYMyszMlwb5rb3KmuOgS3PwnwzaQisBrzFGVfLYQYlZqx3dYK fNRYzQgpWfmbgBpoBh6uDP56LpPb5lInHl+QADJl1EyyrAD8veOxC3QSLRyQUISwo+Ao FWHw== X-Gm-Message-State: AOAM531Gmjv/mX/INrSVoX7Z4eR8Knno4P5Op5k4Qtg1pwVVTZ51hqrx mpfBV06ZBMnuRntaaoJaRsXDWzes2Mamfa0dSu4e7K3jXsd3IGvfm/FHFYpfEJuouEy5LYSGzlg AzDJoziGKa9QT1pfPAFRqOIbtiEg0XXsb98Np4F3+uFLjrPyhkFRO96VO97bfmMNHp8ci4EM= X-Google-Smtp-Source: ABdhPJylkw7UwCSviEJkmn3POrHwDnQZXLrXLSjnkQBXqXqmyenT4Tl3IuWqB67IoKlkTFZxqXVNUrJUA03nkA== X-Received: by 2002:a17:906:f2d6:: with SMTP id gz22mr32613917ejb.407.1593794901347; Fri, 03 Jul 2020 09:48:21 -0700 (PDT) Date: Fri, 3 Jul 2020 18:46:51 +0200 In-Reply-To: <20200703164651.1510825-1-maennich@google.com> Message-Id: <20200703164651.1510825-22-maennich@google.com> Mime-Version: 1.0 References: <20200619214305.562-1-maennich@google.com> <20200703164651.1510825-1-maennich@google.com> X-Mailer: git-send-email 2.27.0.212.ge8ba1cc988-goog Subject: [PATCH v2 21/21] reader/symtab: Improve handling for suppressed aliases To: libabigail@sourceware.org X-Spam-Status: No, score=-21.7 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libabigail@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list of the Libabigail project List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-Patchwork-Original-From: Matthias Maennich via Libabigail From: =?utf-8?q?Matthias_M=C3=A4nnich?= Reply-To: Matthias Maennich Cc: maennich@google.com, kernel-team@android.com Errors-To: libabigail-bounces@sourceware.org Sender: "Libabigail" When reading from XML with a symbol whitelist that leads to suppression of aliased symbols, abidiff would hit an assertion and crash when looking up the aliased symbol due to it being suppressed. In the new symtab reader we can still suppress a symbol without removing it from the lookup. Make use of that property to fix this bug. A test has been added for this as well. * src/abg-reader.cc (build_elf_symbol): Improve handling of suppressed aliased symbols when reading from XML. * src/abg-symtab-reader.cc (load): Likewise. * tests/data/Makefile.am: Add new test data files. * tests/data/test-abidiff-exit/test-missing-alias-report.txt: New test file. * tests/data/test-abidiff-exit/test-missing-alias.abi: Likewise. * tests/data/test-abidiff-exit/test-missing-alias.suppr: Likewise. * tests/test-abidiff-exit.cc: Add support for whitelists and add new testcase. Reviewed-by: Giuliano Procida Signed-off-by: Matthias Maennich --- src/abg-reader.cc | 7 +++++-- src/abg-symtab-reader.cc | 16 ++++++++++++++-- tests/data/Makefile.am | 3 +++ .../test-missing-alias-report.txt | 0 .../test-abidiff-exit/test-missing-alias.abi | 12 ++++++++++++ .../test-abidiff-exit/test-missing-alias.suppr | 4 ++++ tests/test-abidiff-exit.cc | 9 +++++++++ 7 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 tests/data/test-abidiff-exit/test-missing-alias-report.txt create mode 100644 tests/data/test-abidiff-exit/test-missing-alias.abi create mode 100644 tests/data/test-abidiff-exit/test-missing-alias.suppr diff --git a/src/abg-reader.cc b/src/abg-reader.cc index 3f636d00f9b8..d71e2d43503a 100644 --- a/src/abg-reader.cc +++ b/src/abg-reader.cc @@ -2850,7 +2850,8 @@ build_elf_symbol(read_context& ctxt, const xmlNodePtr node, elf_symbol::version version(version_string, is_default_version); - if (drop_if_suppressed && suppr::is_elf_symbol_suppressed(ctxt, name, type)) + const bool is_suppressed = suppr::is_elf_symbol_suppressed(ctxt, name, type); + if (drop_if_suppressed && is_suppressed) return elf_symbol_sptr(); const environment* env = ctxt.get_environment(); @@ -2860,6 +2861,8 @@ build_elf_symbol(read_context& ctxt, const xmlNodePtr node, version, visibility, /*is_linux_string_cst=*/false); + e->set_is_suppressed(is_suppressed); + if (crc != 0) e->set_crc(crc); @@ -2950,7 +2953,7 @@ build_elf_symbol_db(read_context& ctxt, elf_symbol_sptr sym; for (xmlNodePtr n = node->children; n; n = n->next) { - if ((sym = build_elf_symbol(ctxt, n, /*drop_if_suppress=*/true))) + if ((sym = build_elf_symbol(ctxt, n, /*drop_if_suppress=*/false))) { id_sym_map[sym->get_id_string()] = sym; xml_node_ptr_elf_symbol_map[n] = sym; diff --git a/src/abg-symtab-reader.cc b/src/abg-symtab-reader.cc index c50c0f643386..424817106e70 100644 --- a/src/abg-symtab-reader.cc +++ b/src/abg-symtab-reader.cc @@ -361,7 +361,13 @@ symtab::load_(string_elf_symbols_map_sptr function_symbol_map, end = function_symbol_map->end(); it != end; ++it) { - symbols_.insert(symbols_.end(), it->second.begin(), it->second.end()); + for (elf_symbols::const_iterator sym_it = it->second.begin(), + sym_end = it->second.end(); + sym_it != sym_end; ++sym_it) + { + if (!(*sym_it)->is_suppressed()) + symbols_.push_back(*sym_it); + } ABG_ASSERT(name_symbol_map_.insert(*it).second); } @@ -371,7 +377,13 @@ symtab::load_(string_elf_symbols_map_sptr function_symbol_map, end = variables_symbol_map->end(); it != end; ++it) { - symbols_.insert(symbols_.end(), it->second.begin(), it->second.end()); + for (elf_symbols::const_iterator sym_it = it->second.begin(), + sym_end = it->second.end(); + sym_it != sym_end; ++sym_it) + { + if (!(*sym_it)->is_suppressed()) + symbols_.push_back(*sym_it); + } ABG_ASSERT(name_symbol_map_.insert(*it).second); } diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index f39a6d427b1d..bcfc3796d0bc 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -161,6 +161,9 @@ test-abidiff-exit/test-fun-param-v0.o \ test-abidiff-exit/test-fun-param-v1.abi \ test-abidiff-exit/test-fun-param-v1.c \ test-abidiff-exit/test-fun-param-v1.o \ +test-abidiff-exit/test-missing-alias-report.txt \ +test-abidiff-exit/test-missing-alias.abi \ +test-abidiff-exit/test-missing-alias.suppr \ \ test-diff-dwarf/test0-v0.cc \ test-diff-dwarf/test0-v0.o \ diff --git a/tests/data/test-abidiff-exit/test-missing-alias-report.txt b/tests/data/test-abidiff-exit/test-missing-alias-report.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/data/test-abidiff-exit/test-missing-alias.abi b/tests/data/test-abidiff-exit/test-missing-alias.abi new file mode 100644 index 000000000000..07a13f5e6d15 --- /dev/null +++ b/tests/data/test-abidiff-exit/test-missing-alias.abi @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/tests/data/test-abidiff-exit/test-missing-alias.suppr b/tests/data/test-abidiff-exit/test-missing-alias.suppr new file mode 100644 index 000000000000..bcebae43a350 --- /dev/null +++ b/tests/data/test-abidiff-exit/test-missing-alias.suppr @@ -0,0 +1,4 @@ +[suppress_function] + symbol_name_not_regexp = ^__foo$ + drop = true + diff --git a/tests/test-abidiff-exit.cc b/tests/test-abidiff-exit.cc index 4d9c19437e60..772baa78cf91 100644 --- a/tests/test-abidiff-exit.cc +++ b/tests/test-abidiff-exit.cc @@ -212,6 +212,15 @@ InOutSpec in_out_specs[] = "data/test-abidiff-exit/test-fun-param-report.txt", "output/test-abidiff-exit/test-fun-param-report.txt" }, + { + "data/test-abidiff-exit/test-missing-alias.abi", + "data/test-abidiff-exit/test-missing-alias.abi", + "data/test-abidiff-exit/test-missing-alias.suppr", + "", + abigail::tools_utils::ABIDIFF_OK, + "data/test-abidiff-exit/test-missing-alias-report.txt", + "output/test-abidiff-exit/test-missing-alias-report.txt" + }, {0, 0, 0 ,0, abigail::tools_utils::ABIDIFF_OK, 0, 0} };