From patchwork Fri Dec 8 21:00:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Domani X-Patchwork-Id: 81765 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 775243858413 for ; Fri, 8 Dec 2023 21:01:11 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from sonic301-22.consmr.mail.ir2.yahoo.com (sonic301-22.consmr.mail.ir2.yahoo.com [77.238.176.99]) by sourceware.org (Postfix) with ESMTPS id 5D7223858CDB for ; Fri, 8 Dec 2023 21:00:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5D7223858CDB Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=yahoo.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=yahoo.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 5D7223858CDB Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=77.238.176.99 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702069258; cv=none; b=uEkSctnVWLVc78ab3e62opKC0uwjcd5LSun9x1Zyko45zcPcIRuOVW2snr150uQngyTEZn4RDGg4P5byRuyehu7617N1mn6L6Be8frHu77Zp6ogCu623dbvs3/qMw7O3PxcmPc0PvEswf+8DtpJuGOyPMDz34zP1Id7m6I2bovE= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1702069258; c=relaxed/simple; bh=jJqFHQvD+n1jcf9z60naJ5uHXnwviY4u2jbA4+WPY/I=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=xR0BHeMWGhqqGrTo1xJhUvcH6td+BLV4zK3XhwzPBjcdm/EFuw5LjL62TB90sAaw5w8oTMndFMjD8mDhjb2aveuPOQTeT7MTZrO0Tpd5t93D1Df6VlDRWrKwOpwVXxX17PKhDIHPptx7sg7zy2SSV8Nd6ZXOCYoHCfXgWbb3NK4= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1702069255; bh=Ks4jbC2j0sspDMpOEYoTesq5dgB30IHaI2OYgEzQpbM=; h=From:To:Subject:Date:References:From:Subject:Reply-To; b=lSkCLauLPP0BAYul0z1rtnqcI5nuVjkD2FLcDdrkS6N8+fclnMv12WytCp5aNzEXOc8QRx+nJHrBtYeHHWzX6YCXmr6P59T/QVRHQ+jb2igRhFoQ5eePfNxkNZeNbTWWcqyP84LyFNTx6Dwa5RochrYct3/aPPSS8gXU9VndAd8Id1IYiDvVP8OYHdq7kArTQGs4ikOdKvsIivFCgMTnvRP8IaDHkxzRSi6SEtbeqX7ui7PDtTUL328/baJqLwjwEGydnaVgUVsUzDc1TEDrkTqN0zTZE7H8xzoJxUF4ipjRlQyMJc/1QLdbBJ4Ts2z9wfQfXZOOnFgMOLvgebEvpA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1702069255; bh=3OttGyAPKC0chUZB4E5jvIA8rE5gf3lwynm+q+4MWIQ=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=H99twIcCyKCHIoze5Hm8kZ0Uwlnti7Gq4YQGykzXl6Hz36vA1lT5bao9VGaz4t60RzqMsjEr8KhJucFpFP35fGioMVxjYTdU4Y+a/u8MI4ypLyUcCzhT6GfSO40VFo3wsY4WfiycyAmTl97s0tm5YCYAUjbLqlUwJOHzpDPC5QKeIl0L8BednVSP62ZXhbn03lQaD+5WIhLM4AipuRVDLWY4rnDhvk5N9wFM2Uf/jmINXAWIul4sWsNcgAXPf09GjtPNgP3PUGAEiV+pDXslUX4WqJNQaODS+hWheWBklzweecMFzyXLRu/4kySWDQ4EhMn1W93ohXfrT9/NMeG9DA== X-YMail-OSG: 5jCNgakVM1kGBqMxLI1ynwmk4mW6wtZC8Zum8BGnNJgKQMn7WGRUxvJls9BK.JR XFwfJznkipRn2CTNHaMgpK9.FHnCGsy6Kdtqc4MRJwQ_WiA.B00pcfM.X5UWIUPWGSagw4.N5P7b ob5pf3wNeqdC3ZN73kRENWaNaChlR7v1N6vZ9asbjkJERcYi9Dc1roBfPwqRkDNFiON6hFiC84I3 yr_7xFVbux.dMhpuhnrz11jY.IFvdxEu0PXW22qxuxockyzrfR5nm8Ehrbjxu1.oIBNgvTQVwWAD rVM3MWnhaPGLgxbClRAMZGIjR3Z01Tl.HeeNTsjcY_Vq0uGMvJRjw2iIv_a48nvSStMiJSCpa_uG .1pP5Z6dLfwv5Z1xEV91iGhDzBNmiLiw.jM1OtGsH761_pBj_OnXM1KUdi8lUCqwVnlLn0EKUPf0 XYlPeBT0IBb9c0VVsDM1drO1BRLZapjqmxzPwBSbR7Qddc5uyrl2cVkM9WolMD_w804KBm3snZxh b0rCJD3IUtFkkzhJ5wFIoMQERHYJxuTHXSm5UE7kTmeK5SCwGfkYlZT3n7nZRjc_.xMZ8jviv.Q0 NFty7P.nWGKZOcUz5oJ4WRYUfyq39mFvAeBUZXlZYBxOUU6jhcq6v95jT8_AYVRcwHLFlXRr3TKz 0zKTzQEC0i1J3p9y7hd.cgcKUJ78uOBWNCbr5sLBZxbbDh6GZV_fCtfzc3mZYv03sdDhEdgxknwE Tsu8umX8olChTOjwVv2PH5DMrZ77M1me4JsO2frTsGMNhXej0P2hFM_KmJMzFHPhBWKT.PBfGwMB PaTJQD8gJIp0J.OGHTPay4P9e.eHo.OrZMt_YCKSncuhCR4JqdYrUPWdVt5JSqoNqzH7qcL.i29Z HFNL931WFLWcC3NNejFr08LmuRZnlW8xHstZKTkpNB_m2IHPJD7twyihEgGibYFilrk7wYB_xY5m KzTOP8NAuD6r_pqVfffufkZrG23EiPUd0D1lEiVdYi3N_tyvX3qWTXP7dyUbGeyoVZLeKfv1SazZ jYSHUmm5n0yijANc.Ag2JdbZIyRPgdcARLi1ZObfK.6nUPYxR0nOPfX4gA3aD5zDavnD6LcfsOuo hJg6NQW37FHHoBuzO.MzztvuzG_HTZThlqqnIJzzpjnM9uyrWg_catFjj1uap8Xb0NT0ULvxsDFf 9tLmZ0jvGOBBXyrp88CnyEGF64lgLsZZ_KkDwS8B.Jm4FPRXwp3EQh8QTSdO1CUX3TA3qDVfu34r 6.c7egCt7FHttT8LT47xbo6jWPkBJMaa6_yyV.isbnZria21o9BNWN6cZNAjUrc6Pa5zjL.wmBnZ 4qjfnfovH7KSg_n1vJ47NBREX1o3yr2v9y1ZV36BhfW9BVQCxzB4f9GhL0jO_NaSxNVTUTYv5dTf vWi6B2LkhMegQTtz_EKiXH2zbtcT8K4s9VHo7axD4_at_WI8bdjTC23kXN1vujD2ftULluln3j_V 8McXzLFtIjENaplk6_16.NsKFXRMo4uGRd8zLnf91cH8vxRFJ4KaIDCN3h0t5Im1TJOcMceIRFED nMfbxzoQmzH63uodtPOwAEg1QsMI8HaQR0N5oT.bqJATZfD76x7H23b9j1hyl8MZTNJ_nDlociMU M27iHo.vKeUquB6siRvDfhkyYIUco2IjtxFNtXY39rJoU.935Mcjxx7p3gVzFAPNrssUDQ161jTd JBKc14uia3Uj9OQUWrIaDO3FF9S7tcsn.uWpvlJ.pDPcXDAoHW3RcIbIelXTFEe.8AQzb4fePgRR biWSmZHWDIb8WSlmfztBxveh6aoX_onwg_Y9Rzm67xKXRSC26C2hE3Pt25_bisAZsTGC7Ar1qtRt iHULdUxVjN_2OA08OZoO3oElbRzWgHogKhob6EHdtGM3UJ.lbUFakbgZ810ExlvwVGSTbrHAccWV zgA8gvvtTfXKd_DFa3IHyAFCnL8fuN0LEEm9m9D6LqGnAFCdvfq5MtdjsoXNNq3u8IZUZ.2TF4GL rdSenHXfCiyQW8gGPZHsdztS2zVa03u9Hr2cous3XAdgqbdfRXZJK018nGePytbDbwmGRAwbZyne Mfg_QpkPriF8zmWUawO7HBU__yIKrx9hjvjCjU9L1T8IMmdBrNuoKBarK1mfRTIupZgJNs9F_3SC ny6E70FOSp13AsRYrG8IXdV_gvUgdK6xLYQRSp51B3G7zABK.nX6HkNbqMhHgYj2GH6k4Ffjrtp9 8rCEm_RcmqvbPAjeuYMZGDm9QOC_gn0AOyFMJ X-Sonic-MF: X-Sonic-ID: f9440b21-0d79-4372-adb7-ba8319037a5f Received: from sonic.gate.mail.ne1.yahoo.com by sonic301.consmr.mail.ir2.yahoo.com with HTTP; Fri, 8 Dec 2023 21:00:55 +0000 Received: by hermes--production-ir2-95776f84c-rphpl (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 0187483146f0aa34912384e0e340600f; Fri, 08 Dec 2023 21:00:50 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Subject: [PATCH] Fix dynamic_cast Date: Fri, 8 Dec 2023 22:00:16 +0100 Message-Id: <20231208210016.5260-1-ssbssa@yahoo.de> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 X-Antivirus: Avast (VPS 231208-4, 12/08/2023), Outbound message X-Antivirus-Status: Clean References: <20231208210016.5260-1-ssbssa.ref@yahoo.de> X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org PR29011 notes that dynamic_cast does not work correctly if classes with virtual methods are involved, some of the results wrongly point into the vtable of the derived class: ``` (gdb) p vlr $1 = (VirtualLeftRight *) 0x162240 (gdb) p vl $2 = (VirtualLeft *) 0x162240 (gdb) p vr $3 = (VirtualRight *) 0x162250 (gdb) p dynamic_cast(vlr) $4 = (VirtualLeftRight *) 0x13fab89b0 (gdb) p dynamic_cast(vl) $5 = (VirtualLeftRight *) 0x13fab89b0 (gdb) p dynamic_cast(vr) $6 = (VirtualLeftRight *) 0x13fab89b0 (gdb) p dynamic_cast(vlr) $7 = (VirtualLeft *) 0x162240 (gdb) p dynamic_cast(vl) $8 = (VirtualLeft *) 0x13fab89b0 (gdb) p dynamic_cast(vr) $9 = (VirtualLeft *) 0x162240 (gdb) p dynamic_cast(vlr) $10 = (VirtualRight *) 0x162250 (gdb) p dynamic_cast(vl) $11 = (VirtualRight *) 0x162250 (gdb) p dynamic_cast(vr) $12 = (VirtualRight *) 0x13fab89b0 ``` For the cases where the dynamic_cast type is the same as the original type, it used the ARG value for the result, which in case of pointer types was already the dereferenced value. And the TEM value at the value address was created with the pointer/reference type, not the actual class type. With these fixed, the dynamic_cast results make more sense: ``` (gdb) p vlr $1 = (VirtualLeftRight *) 0x692240 (gdb) p vl $2 = (VirtualLeft *) 0x692240 (gdb) p vr $3 = (VirtualRight *) 0x692250 (gdb) p dynamic_cast(vlr) $4 = (VirtualLeftRight *) 0x692240 (gdb) p dynamic_cast(vl) $5 = (VirtualLeftRight *) 0x692240 (gdb) p dynamic_cast(vr) $6 = (VirtualLeftRight *) 0x692240 (gdb) p dynamic_cast(vlr) $7 = (VirtualLeft *) 0x692240 (gdb) p dynamic_cast(vl) $8 = (VirtualLeft *) 0x692240 (gdb) p dynamic_cast(vr) $9 = (VirtualLeft *) 0x692240 (gdb) p dynamic_cast(vlr) $10 = (VirtualRight *) 0x692250 (gdb) p dynamic_cast(vl) $11 = (VirtualRight *) 0x692250 (gdb) p dynamic_cast(vr) $12 = (VirtualRight *) 0x692250 ``` Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29011 --- gdb/testsuite/gdb.cp/casts.cc | 22 ++++++++++++++++++++++ gdb/testsuite/gdb.cp/casts.exp | 20 ++++++++++++++++++++ gdb/valops.c | 12 ++++++++---- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/gdb/testsuite/gdb.cp/casts.cc b/gdb/testsuite/gdb.cp/casts.cc index f64d13c26df..5c7f9dc8a1c 100644 --- a/gdb/testsuite/gdb.cp/casts.cc +++ b/gdb/testsuite/gdb.cp/casts.cc @@ -50,6 +50,24 @@ struct LeftRight : public Left, public Right { }; +struct VirtualLeft +{ + virtual ~VirtualLeft () {} + + int left; +}; + +struct VirtualRight +{ + virtual ~VirtualRight () {} + + int right; +}; + +struct VirtualLeftRight : public VirtualLeft, public VirtualRight +{ +}; + int main (int argc, char **argv) { @@ -70,5 +88,9 @@ main (int argc, char **argv) unsigned long long gd_value = (unsigned long long) (std::uintptr_t)&gd; unsigned long long r_value = (unsigned long long) (Right *) &gd; + VirtualLeftRight *vlr = new VirtualLeftRight (); + VirtualLeft *vl = vlr; + VirtualRight *vr = vlr; + return 0; /* breakpoint spot: casts.exp: 1 */ } diff --git a/gdb/testsuite/gdb.cp/casts.exp b/gdb/testsuite/gdb.cp/casts.exp index 41bb1259270..a0c73826fa8 100644 --- a/gdb/testsuite/gdb.cp/casts.exp +++ b/gdb/testsuite/gdb.cp/casts.exp @@ -180,6 +180,26 @@ gdb_test "print (unsigned long long) (LeftRight *) (Right *) &gd == gd_value" \ gdb_test "print (unsigned long long) (LeftRight *) (Right *) r_value == gd_value" \ " = true" +gdb_test "print dynamic_cast (vlr) == vlr" " = true" +gdb_test "print dynamic_cast (vl) == vlr" " = true" +gdb_test "print dynamic_cast (vr) == vlr" " = true" +gdb_test "print dynamic_cast (vlr) == vl" " = true" +gdb_test "print dynamic_cast (vl) == vl" " = true" +gdb_test "print dynamic_cast (vr) == vl" " = true" +gdb_test "print dynamic_cast (vlr) == vr" " = true" +gdb_test "print dynamic_cast (vl) == vr" " = true" +gdb_test "print dynamic_cast (vr) == vr" " = true" + +gdb_test "print &dynamic_cast (*vlr) == vlr" " = true" +gdb_test "print &dynamic_cast (*vl) == vlr" " = true" +gdb_test "print &dynamic_cast (*vr) == vlr" " = true" +gdb_test "print &dynamic_cast (*vlr) == vl" " = true" +gdb_test "print &dynamic_cast (*vl) == vl" " = true" +gdb_test "print &dynamic_cast (*vr) == vl" " = true" +gdb_test "print &dynamic_cast (*vlr) == vr" " = true" +gdb_test "print &dynamic_cast (*vl) == vr" " = true" +gdb_test "print &dynamic_cast (*vr) == vr" " = true" + if {[prepare_for_testing "failed to prepare" ${testfile}03 $srcfile2 \ {debug c++ additional_flags=-std=c++03}]} { return -1 diff --git a/gdb/valops.c b/gdb/valops.c index b0e95c330a0..49ea1fd7676 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -856,7 +856,7 @@ value_dynamic_cast (struct type *type, struct value *arg) /* If the classes are the same, just return the argument. */ if (class_types_same_p (class_type, arg_type)) - return value_cast (type, arg); + return value_cast (type, original_arg); /* If the target type is a unique base class of the argument's declared type, just cast it. */ @@ -888,14 +888,18 @@ value_dynamic_cast (struct type *type, struct value *arg) && resolved_type->target_type ()->code () == TYPE_CODE_VOID) return value_at_lazy (type, addr); - tem = value_at (type, addr); - type = tem->type (); + tem = value_at (resolved_type->target_type (), addr); + type = (is_ref + ? lookup_reference_type (tem->type (), resolved_type->code ()) + : lookup_pointer_type (tem->type ())); /* The first dynamic check specified in 5.2.7. */ if (is_public_ancestor (arg_type, resolved_type->target_type ())) { if (class_types_same_p (rtti_type, resolved_type->target_type ())) - return tem; + return (is_ref + ? value_ref (tem, resolved_type->code ()) + : value_addr (tem)); result = NULL; if (dynamic_cast_check_1 (resolved_type->target_type (), tem->contents_for_printing ().data (),