From patchwork Wed Aug 28 03:28:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Terekhov, Mikhail via Gdb-patches" X-Patchwork-Id: 34292 Received: (qmail 91828 invoked by alias); 28 Aug 2019 03:28:19 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 91796 invoked by uid 89); 28 Aug 2019 03:28:14 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.4 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=H*MI:google, HX-HELO:sk:mail-pg, H*r:sk:mail-pg X-HELO: mail-pg1-f201.google.com Received: from mail-pg1-f201.google.com (HELO mail-pg1-f201.google.com) (209.85.215.201) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 28 Aug 2019 03:28:13 +0000 Received: by mail-pg1-f201.google.com with SMTP id z35so813106pgk.10 for ; Tue, 27 Aug 2019 20:28:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:message-id:mime-version:subject:from:to:cc; bh=cPfZKvJHTLe7VxqJ4MRrAKBPwzT3nGblPnaRPHRCRIs=; b=DBl2Ujhgrv7W0G0cmozOaIFPB3OKpfcsIDUPzPW58PzhNCWDoqx3jiQa48ZEO253LA 78WB5q5rNMDcgE+/lHyjUsKT1WzooHDDmedoitoPQOx6x4Sqr6PYewm0GA51sG74b0Ay I6Xj2ApOEajHGICgo/oPW1gSkPyd+bOb9Sa73vPA8vYXu6NXE0EfRG0uyOPPdlXqoFdw H+gF324SVbZ+NKwj5TCQpddoOE476QQvEF4iaFHnaLP2dshn3kuzJecsutf07w4lmMIS 8uyse5jPWeP4zjusW6bDiReU9wzTAjo3fCoImym1PzACPVlhGBA6c3OpGPc8JqMGb6hY D1lg== Date: Tue, 27 Aug 2019 20:28:08 -0700 Message-Id: <20190828032808.242363-1-tamur@google.com> Mime-Version: 1.0 Subject: [PATCH] Fix float to LONGEST conversion. X-Patchwork-Original-From: "Ali Tamur via gdb-patches" From: "Terekhov, Mikhail via Gdb-patches" Reply-To: Ali Tamur To: gdb-patches@sourceware.org Cc: Ali Tamur X-IsSubscribed: yes The code used to have undefined behaviour. gdb/ChangeLog: *gdb/target-float.c (host_float_ops::to_longest): Update implementation. --- gdb/target-float.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/gdb/target-float.c b/gdb/target-float.c index 39abb12696..0fd71c0dc3 100644 --- a/gdb/target-float.c +++ b/gdb/target-float.c @@ -1007,13 +1007,18 @@ host_float_ops::to_longest (const gdb_byte *addr, { T host_float; from_target (type, addr, &host_float); - /* Converting an out-of-range value is undefined behavior in C, but we - prefer to return a defined value here. */ - if (host_float > std::numeric_limits::max()) - return std::numeric_limits::max(); - if (host_float < std::numeric_limits::min()) + T min_possible_range = static_cast(std::numeric_limits::min()); + T max_possible_range = -min_possible_range; + /* host_float can be converted to an integer as long as it's in + the range [min_possible_range, max_possible_range). If not, it is either + too large, or too small, or is NaN; in this case return the maximum or + minimum possible value. */ + if (host_float < max_possible_range && host_float >= min_possible_range) + return static_cast (host_float); + if (host_float < min_possible_range) return std::numeric_limits::min(); - return (LONGEST) host_float; + /* This line will be executed if host_float is NaN. */ + return std::numeric_limits::max(); } /* Convert signed integer VAL to a target floating-number of type TYPE