From patchwork Wed Jul 22 10:57:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 40145 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 467A738754AF; Wed, 22 Jul 2020 10:57:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 467A738754AF DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1595415451; bh=sSWWJXCWM/JvmuGETt1/VWSxsqXgb6itJvVtMxzS7aI=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Help: List-Subscribe:From:Reply-To:Cc:From; b=tbZCkfP6WFFgI8IdIvJlHRMrKoaeAsEkkiUg04eHsFOt17nKp/ITNiz71ns+kDKSp K/4S/VOxw/wt1u1BMBHw7+6dyzcbvEY1ehs2gMRRFUEnz+OUKX7ZYJPuRI4djidQ9I NeAp8Oo+QxIYyskHQUQaN3L6kSKHpnR3qXmxV2nE= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from mail-wr1-x44a.google.com (mail-wr1-x44a.google.com [IPv6:2a00:1450:4864:20::44a]) by sourceware.org (Postfix) with ESMTPS id 9037238708A4 for ; Wed, 22 Jul 2020 10:57:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 9037238708A4 Received: by mail-wr1-x44a.google.com with SMTP id s16so479845wrv.1 for ; Wed, 22 Jul 2020 03:57:28 -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:message-id:mime-version:subject:from:to:cc; bh=sSWWJXCWM/JvmuGETt1/VWSxsqXgb6itJvVtMxzS7aI=; b=RgdFIuzvkMRfXcY5UtgxIOdXENNQ0qkKLdOSeqLeDVEpBULM6n9bQjJshSORtoQMVU QoC9iq7XbZLhTLi8u4KgpaWgQiyaBRH33w/a6aadhWSgONcJ079SryWuvn5teFsdQ91L R99Mc3X3DMYGGwTuh8+x8xIzl1HwuVjE4tvinjmgOlRazVNJ+e7wvEjuMtxPYmLOhYVq tdpJNq4Fk8VQOkX9LeBkt1fCyR8dV6+KN895c9ekJG29Qlw8bxMFhPr7vlHvaoOduO2v XYm0I0B7snKzyC/4CFt/rY0qNe/2Xrt7svJWyhY1Eb+i/aCabfAEMduePb2vytpVbKXb J40Q== X-Gm-Message-State: AOAM531cS6vZyCzxde0APQNodGOQV2ZnAx+WwMlWcpU8h8oaSg50t0Cv 5+gPFsqQCz64ClDq8RbLKeGTG5Q8qLvSgrjZcugbCtAPgMedKzPGKc8JZPzRabQfUqYBX0ocI16 EkLsPXO7QxB+ym6gCmfGbNw+1i6qxaSyqAAd+2NuoQYijMUrnnJw2SsAQ7nEMuVpx10Py/C0= X-Google-Smtp-Source: ABdhPJzWHzYWVoFn8NJK+corCHbISqbQIk7hlqJ0h+G2uLwH2uwxkmN4K6evarR/j4XnQJB2dmKmoejpOu7yDw== X-Received: by 2002:a1c:1d2:: with SMTP id 201mr682835wmb.132.1595415447603; Wed, 22 Jul 2020 03:57:27 -0700 (PDT) Date: Wed, 22 Jul 2020 11:57:23 +0100 Message-Id: <20200722105723.2547112-1-gprocida@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.28.0.rc0.105.gf9edc3c819-goog Subject: [PATCH] Make decl_names_equal more accurate To: libabigail@sourceware.org X-Spam-Status: No, score=-22.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: Giuliano Procida via Libabigail From: Giuliano Procida Reply-To: Giuliano Procida Cc: maennich@google.com, kernel-team@android.com Errors-To: libabigail-bounces@sourceware.org Sender: "Libabigail" This utility function compares qualified names component-wise with special handling of components that are anonymous names. The code is incorrect for some cases when there are different numbers of components on each side. Also, the control flow in the loop body is more complex than it needs to be. This commit simplifies the control flow, fixes the comparison bugs and adds some extra tests to cover these cases. * src/abg-tools-utils.cc (decl_names_equal): Move {l,r}_pos2 declarations into the loop and make {l,r}_length const. Avoid chance of arithmetic on string::npos values. Rework logic so there is a single test for "names compare equal" and a single test for different numbers of name components. * tests/test-tools-utils.cc (main): Add nine more tests. Signed-off-by: Giuliano Procida --- src/abg-tools-utils.cc | 72 +++++++++++++++------------------------ tests/test-tools-utils.cc | 10 ++++++ 2 files changed, 38 insertions(+), 44 deletions(-) diff --git a/src/abg-tools-utils.cc b/src/abg-tools-utils.cc index dfbec879..38e2f175 100644 --- a/src/abg-tools-utils.cc +++ b/src/abg-tools-utils.cc @@ -510,61 +510,45 @@ get_anonymous_enum_internal_name_prefix() bool decl_names_equal(const string& l, const string& r) { - string::size_type l_pos1 = 0, l_pos2 = 0, r_pos1 = 0, r_pos2 = 0; - string::size_type l_length = l.length(), r_length = r.length(); + string::size_type l_pos1 = 0, r_pos1 = 0; + const string::size_type l_length = l.length(), r_length = r.length(); while (l_pos1 < l_length && r_pos1 < r_length) { - l_pos2 = l.find("::", l_pos1); - r_pos2 = r.find("::", r_pos1); + string::size_type l_pos2 = l.find("::", l_pos1); + string::size_type r_pos2 = r.find("::", r_pos1); + if (l_pos2 == string::npos) + l_pos2 = l_length; + if (r_pos2 == string::npos) + r_pos2 = r_length; - if ((l.compare(l_pos1, - ANONYMOUS_STRUCT_INTERNAL_NAME_LEN, - ANONYMOUS_STRUCT_INTERNAL_NAME) == 0 - && r.compare(r_pos1, + if (l.compare(l_pos1, l_pos2 - l_pos1, r, + r_pos1, r_pos2 - r_pos1) + && (l.compare(l_pos1, ANONYMOUS_STRUCT_INTERNAL_NAME_LEN, - ANONYMOUS_STRUCT_INTERNAL_NAME) == 0) - || - (l.compare(l_pos1, - ANONYMOUS_UNION_INTERNAL_NAME_LEN, - ANONYMOUS_UNION_INTERNAL_NAME) == 0 - && r.compare(r_pos1, + ANONYMOUS_STRUCT_INTERNAL_NAME) + || r.compare(r_pos1, + ANONYMOUS_STRUCT_INTERNAL_NAME_LEN, + ANONYMOUS_STRUCT_INTERNAL_NAME)) + && (l.compare(l_pos1, ANONYMOUS_UNION_INTERNAL_NAME_LEN, - ANONYMOUS_UNION_INTERNAL_NAME) == 0) - || - (l.compare(l_pos1, - ANONYMOUS_ENUM_INTERNAL_NAME_LEN, - ANONYMOUS_ENUM_INTERNAL_NAME) == 0 - && r.compare(r_pos1, + ANONYMOUS_UNION_INTERNAL_NAME) + || r.compare(r_pos1, + ANONYMOUS_UNION_INTERNAL_NAME_LEN, + ANONYMOUS_UNION_INTERNAL_NAME)) + && (l.compare(l_pos1, ANONYMOUS_ENUM_INTERNAL_NAME_LEN, - ANONYMOUS_ENUM_INTERNAL_NAME) == 0)) - { - if (l_pos2 == l.npos || r_pos2 == r.npos) - return true; - - l_pos1 = l_pos2 + 2; - r_pos1 = r_pos2 + 2; - continue; - } - - if (l_pos2 == l.npos || r_pos2 == r.npos) - { - if (l_pos2 != r_pos2) - return false; - - return !l.compare(l_pos1, l_pos2, r, - r_pos1, r_pos2); - } - - if (l.compare(l_pos1, l_pos2 - l_pos1, r, - r_pos1, r_pos2 - r_pos1)) + ANONYMOUS_ENUM_INTERNAL_NAME) + || r.compare(r_pos1, + ANONYMOUS_ENUM_INTERNAL_NAME_LEN, + ANONYMOUS_ENUM_INTERNAL_NAME))) return false; - l_pos1 = l_pos2 + 2; - r_pos1 = r_pos2 + 2; + l_pos1 = l_pos2 == l_length ? l_pos2 : l_pos2 + 2; + r_pos1 = r_pos2 == r_length ? r_pos2 : r_pos2 + 2; } - return true; + return (l_pos1 == l_length) == (r_pos1 == r_length); } /// If a given file is a symbolic link, get the canonicalized absolute diff --git a/tests/test-tools-utils.cc b/tests/test-tools-utils.cc index d29bb8c9..5597873f 100644 --- a/tests/test-tools-utils.cc +++ b/tests/test-tools-utils.cc @@ -86,5 +86,15 @@ main(int, char**) ABG_ASSERT(decl_names_equal("S0::m2", "S0::m12") == false); + ABG_ASSERT(!decl_names_equal("S0::S1", "S0")); + ABG_ASSERT(!decl_names_equal("S0", "S0::S1")); + ABG_ASSERT(!decl_names_equal("S1::S0", "S0::S1")); + ABG_ASSERT(!decl_names_equal("__anonymous_struct__::S0", "__anonymous_struct__")); + ABG_ASSERT(!decl_names_equal("__anonymous_struct__", "__anonymous_struct__::S1")); + ABG_ASSERT(!decl_names_equal("__anonymous_struct__::S0", "__anonymous_struct__::S1")); + ABG_ASSERT(!decl_names_equal("S0::__anonymous_struct__", "__anonymous_struct__")); + ABG_ASSERT(!decl_names_equal("__anonymous_struct__", "S1::__anonymous_struct__")); + ABG_ASSERT(!decl_names_equal("S0::__anonymous_struct__", "S1::__anonymous_struct__")); + return 0; }