public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Patrick Palka <patrick@parcs.ath.cx>
To: gdb-patches@sourceware.org
Cc: Patrick Palka <patrick@parcs.ath.cx>
Subject: [PATCH] Avoid invoking undefined behavior when initializing CRC table
Date: Mon, 28 Dec 2015 04:10:00 -0000	[thread overview]
Message-ID: <1451275797-648-1-git-send-email-patrick@parcs.ath.cx> (raw)

When I built GDB with (an older snapshot of) GCC 6 I get the following
error:

.../binutils-gdb/gdb/gdbserver/server.c: In function ‘crc32’:
.../binutils-gdb/gdb/gdbserver/server.c:1895:15: error: iteration 128 invokes undefined behavior [-Werror=aggressive-loop-optimizations]
    for (c = i << 24, j = 8; j > 0; --j)
               ^
.../binutils-gdb/gdb/gdbserver/server.c:1893:7: note: within this loop
       for (i = 0; i < 256; i++)
       ^
This error seems to be correct.  When the variable "int i" is >= 128,
the computation "i << 24" overflows for 32-bit signed int.

To avoid shifting into the sign bit, this patch makes the variables i
(and j, because why not) have type unsigned int instead.

(Alternatively, I can just define this local crc32 function in terms of
libiberty's xcrc32.  Any reason not to?  xcrc32 seems to be
based off of GDB's crc32 implementation.  Its documentation even
refers to it!)

gdb/gdbserver/ChangeLog:

	* server.c (crc32): Change type of induction variables i and j
	from int to unsigned int.
---
 gdb/gdbserver/server.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index b385afb..70acafc 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -1927,7 +1927,7 @@ crc32 (CORE_ADDR base, int len, unsigned int crc)
   if (!crc32_table[1])
     {
       /* Initialize the CRC table and the decoding table.  */
-      int i, j;
+      unsigned int i, j;
       unsigned int c;
 
       for (i = 0; i < 256; i++)
-- 
2.7.0.rc1.98.gacf58d0.dirty

             reply	other threads:[~2015-12-28  4:10 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-28  4:10 Patrick Palka [this message]
2015-12-28  4:15 ` Patrick Palka
2015-12-28 11:53   ` Pedro Alves
2015-12-28 16:22     ` [PATCH] [COMMITTED] Use libiberty's crc32 implementation in gdbserver Patrick Palka

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1451275797-648-1-git-send-email-patrick@parcs.ath.cx \
    --to=patrick@parcs.ath.cx \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).