[PATCH][PR gdb/24351] Fix wrong format specification in display_selector()
Jon Turney
jon.turney@dronecode.org.uk
Thu Mar 28 15:46:00 GMT 2019
On 17/03/2019 18:44, Simon Marchi wrote:
> On 2019-03-17 05:48, ÐÐ»Ð°Ð´Ð¸Ð¼Ð¸Ñ ÐаÑÑÑÑнов wrote:
>> There are a wrong format strings in function display_selector() in
>> file windows-nat.c. This leads to build error using Cygwin on Windows.
>> LDT_ENTRY.HighWord is a DWORD, which is unsigned long int, so the
>> format specification should be for long int, not simply int.
>>
>> gdb/ChangeLog:
>> 2019-03-17 Vladimir Martyanov <vilgeforce@gmail.com>
>>
>> Â Â Â PR gdb/24351
>> Â Â Â * windows-nat.c (display_selector): Format specifications fixed
>>
>> Patch and changelog files are attached
>
> Thanks, this LGTM. I altavista'ed and it looks like this is the right
> thing to do to print DWORDs. It also builds fine with
> i686-w64-mingw32-gcc and x86_64-w64-mingw32-gcc on Linux.
Thanks for looking at this. But did you test this with
x86_64-pc-cygwin? It fails to build for me:
> ../../gdb/windows-nat.c: In function âint display_selector(HANDLE, DWORD)â:
> ../../gdb/windows-nat.c:1099:65: error: format â%lxâ expects argument of type âlong unsigned intâ, but argument 2 has type âunsigned intâ [-Werror=format=]
> printf_filtered ("Unknown type 0x%lx",info.HighWord.Bits.Type);
> ~~~~~~~~~~~~~~~~~~~~~~~^
> ../../gdb/windows-nat.c:1106:74: error: format â%ldâ expects argument of type âlong intâ, but argument 2 has type âunsigned intâ [-Werror=format=]
> printf_filtered ("Priviledge level = %ld. ", info.HighWord.Bits.Dpl);
I believe this is because, unfortunately, DWORD is not long on 64-bit
Cygwin, because that is LP64 (See [1]).
I think the only portable way to write this (short of introducing
inttypes.h PRI_-style macros) is to explicitly cast DWORD type values to
unsigned long or unsigned int, and use the appropriate format (e.g. see
[2] for a similar patch I wrote for xserver)
Patch attached.
[1] https://cygwin.com/faq.html#faq.programming.64bitporting
[2]
https://cgit.freedesktop.org/xorg/xserver/commit/?id=aa83c61f510121da20b56e8f7de700193f7d16b5
-------------- next part --------------
From e4aba2d5248cd8d2390e9028aa0131174c1cdb6f Mon Sep 17 00:00:00 2001
From: Jon Turney <jon.turney@dronecode.org.uk>
Date: Thu, 28 Mar 2019 14:02:25 +0000
Subject: [PATCH] Fix format specification in display_selector() (again)
DWORD type is not a long on 64-bit Cygwin, because that it is LP64.
Explicitly cast DWORD values to unsigned long and use an appropriate
format.
gdb/ChangeLog:
2019-03-28 Jon Turney <jon.turney@dronecode.org.uk>
* windows-nat.c (display_selector): Fixed format specifications
for 64-bit Cygwin.
---
gdb/ChangeLog | 5 +++++
gdb/windows-nat.c | 6 ++++--
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index d38ade5855..47f6cbb541 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -1096,14 +1096,16 @@ display_selector (HANDLE thread, DWORD sel)
puts_filtered ("Code (Exec/Read, Conf");
break;
default:
- printf_filtered ("Unknown type 0x%lx",info.HighWord.Bits.Type);
+ printf_filtered ("Unknown type 0x%lx",
+ (unsigned long) info.HighWord.Bits.Type);
}
if ((info.HighWord.Bits.Type & 0x1) == 0)
puts_filtered(", N.Acc");
puts_filtered (")\n");
if ((info.HighWord.Bits.Type & 0x10) == 0)
puts_filtered("System selector ");
- printf_filtered ("Priviledge level = %ld. ", info.HighWord.Bits.Dpl);
+ printf_filtered ("Priviledge level = %ld. ",
+ (unsigned long) info.HighWord.Bits.Dpl);
if (info.HighWord.Bits.Granularity)
puts_filtered ("Page granular.\n");
else
--
2.17.0
More information about the Gdb-patches
mailing list