[OpenJDK 2D-Dev] hg: jdk7/2d/jdk: 7022280: Parfait reports Format string argument mismatch in /jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c

Jim Graham james.graham at oracle.com
Wed Mar 9 20:35:17 UTC 2011

Note that these sources were originally created in a day when "unsigned 
long" was a 32-bit quantity in most places and often used to make sure 
you didn't get a 16-bit integer.  That sizing rule of thumb changed over 
the years and now it usually gives you a 64-bit quantity.  (Don't you 
just love C?)

In looking deeper into the SERVER64 directive which controls this 
(setting it would use a CARD32 to define a VisualID which has a more 
concrete 32-bit definition), it looks like they are specifically 
intending that to not be used for client code, but I can find no 
explanation via Google.  The closest that I could find was a commit 
comment to the sources for some X11 client code that mentioned that 
SERVER64 should not be used in client sources because it could wreak 
havoc, but no explanation as to why.

My guess is that they didn't really embrace "machine dependent typedef" 
technology to ensure that these quantities were declared as 32-bit 
quantities until it was too late and they had spawned a mixture of 
versions of Xlib that just had whatever "unsigned long" compiled to. 
(Still, you'd think they would have noticed this as soon as the first 
64-bit Xlib failed to interpret the protocol correctly, no?  Or maybe 
they thought that "unsigned long" was a more natural type for the 
compilers to play with?)  As a result, to go back and fix it for the 
client libraries would cause this compatibility havoc and so they only 
fix it now for server sources.  It's sloppy, but probably necessary due 
to practical concerns.  So I guess it would appear that they really do 
want these local types to be 64-bit quantities despite the fact that the 
protocol defines their data as 32-bit values.

So, after quite a bit of obscure digging, it looks like our use of the 
header files is actually correct and so this fix is accurate now despite 
the conceptual conflict with the definition of the protocol.

%lx, according to the printf/scanf man pages, should track the size of 
"unsigned long" on any given platform and it shouldn't misinterpret the 
correct value of any 32-bit hex string that it parses so I guess there 
is no problem here (other than my now feeling quite a bit more 
disgusted/amused with the cobbled state of the X11 APIs ;-).

Apologies for the disruption... :-(


On 3/9/11 10:00 AM, Phil Race wrote:
> That's what I had supposed too, but the client definition depends on the
> machine
> definition of long.
> % more x.c
> #include <stdlib.h>
> #include <stdio.h>
> #include <X11/X.h>
> int main( int ac, char** av) {
> VisualID id;
> printf("sz=%d\n", sizeof(id));
> }
> % cc -I/usr/openwin/include x.c
> rincewind 125% file a.out
> a.out: ELF 32-bit MSB executable SPARC32PLUS Version 1, V8+ Required,
> dynamically linked, not stripped
> % a.out
> sz=4
> % cc -I/usr/openwin/include -m64 x.c
> % file a.out
> a.out: ELF 64-bit MSB executable SPARCV9 Version 1, dynamically linked,
> not stripped
> % a.out
> sz=8
> -phil.
> Jim Graham wrote:
>> Please revert this fix and re-read the X11 protocol. Something *else*
>> went wrong for parfait to think that we wanted to parse a 64-bit value
>> there. VisualID values are small numbers and transferred as 32-bit
>> quantities in the protocol. If the typedef ended up with a 64-bit
>> representation from the header files then we have probably not
>> configured something correctly...
>> ...jim
>> On 3/9/11 2:37 AM, andrew.brygin at oracle.com wrote:
>>> Changeset: 69ec42543dd9
>>> Author: bae
>>> Date: 2011-03-09 13:08 +0300
>>> URL: http://hg.openjdk.java.net/jdk7/2d/jdk/rev/69ec42543dd9
>>> 7022280: Parfait reports Format string argument mismatch in
>>> /jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c
>>> Reviewed-by: jgodinez, prr
>>> ! src/solaris/native/sun/awt/awt_GraphicsEnv.c

More information about the 2d-dev mailing list