diff options
author | Artur Shepilko <nomadbyte@gmail.com> | 2020-04-10 10:56:43 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2020-04-10 21:04:03 -0400 |
commit | cf83625da29d1239e97f1eb4d145f347cb741889 (patch) | |
tree | 6b707b179bb60dbfbca74a14d8fd4af0f5a7d4c9 | |
parent | de7ac122a7f98c181c1ec175b0560bb48eabc6ea (diff) | |
download | binutils-cf83625da29d1239e97f1eb4d145f347cb741889.zip binutils-cf83625da29d1239e97f1eb4d145f347cb741889.tar.gz binutils-cf83625da29d1239e97f1eb4d145f347cb741889.tar.bz2 |
gdb: fix undefined behavior reported in copy_bitwise
gdb version 9.1, built with clang 8.0.0 on Ubuntu 18.04 (x86_64);
--enable-ubsan (for clang's undefined behavior sanitizer)
Executing command; `maint selftest copy_bitwise` bombs in runtime error:
../../gdb/utils.c:3432:28: runtime error: left shift of negative value -1
Closer look reveals the offending shift: `(~0 << nbits)`, apparently 0
is treated as signed int, resulting in negative complement. Explicitly
stating it unsigned 0U fixes it and the `copy_bitwise` test passes
ok.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/utils.c | 2 |
2 files changed, 6 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 661a414..81102ee 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-04-10 Artur Shepilko <nomadbyte@gmail.com> + + * utils.c (copy_bitwise): Use unsigned 0 constant as operand of + bit shift. + 2020-04-10 Tom Tromey <tromey@adacore.com> * symfile.c (symbol_file_add_separate): Preserve OBJF_MAINLINE. diff --git a/gdb/utils.c b/gdb/utils.c index bda6bbf..f5b2033 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -3433,7 +3433,7 @@ copy_bitwise (gdb_byte *dest, ULONGEST dest_offset, buf |= *source << avail; buf &= (1 << nbits) - 1; - *dest = (*dest & (~0 << nbits)) | buf; + *dest = (*dest & (~0U << nbits)) | buf; } } |