[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