Alignment issue on x86_64?
Andrew Haley
aph@redhat.com
Mon Jun 23 15:17:00 GMT 2008
Rémi Cardona wrote:
> Hi all,
>
> I've spent several days trying to figure out why a program would send
> wrong values to an Xlib call (gcc version 4.3.1, ld 2.18 but I've
> reproduced with 4.2.4).
>
> In a nutshell, here's the problem :
>
> void *utils_atom_get_property(
> Display *dpy, Window win, Atom to_get, Atom type, unsigned int
> *size)
> {
> unsigned char *retval;
> Atom type_ret;
> unsigned long bytes_after, num_ret;
> long length;
> int format_ret;
> void *data;
> int ok;
>
> retval = NULL;
> length = 0x7fffffff;
> ok = XGetWindowProperty(
> dpy, win, to_get, 0L, length, False, type, &type_ret,
> &format_ret, &num_ret, &bytes_after, &retval);
> ...
>
>
> The problem is with the "type" parameter. When utils_atom_get_property
> is called with type=137 :
> - if I break inside that function, "type" is correctly set to 137
> - but if I break inside XGetWindowProperty, "type" changes completely
> and seems to take some of the bytes of the adjacent parameter
> (0x7fff00000089, when "size" is 0x7fff379c7704, the coincidence is just
> too big IMHO).
Or it may be that gdb is misleading you.
How do you know that the parameters to this call are wrong?
> Out of sheer frustration, I just shuffled the declarations at the top of
> the function and it "solved" my bug. Here's the patch I applied to my
> own code (no other changes, just moving the order of the declarations):
>
> @@ -41,11 +41,11 @@ static int atom_size(int format)
> void *utils_atom_get_property(
> Display *dpy, Window win, Atom to_get, Atom type, unsigned int
> *size)
> {
> - unsigned char *retval;
> Atom type_ret;
> - unsigned long bytes_after, num_ret;
> - long length;
> int format_ret;
> + long length;
> + unsigned char *retval;
> + unsigned long bytes_after, num_ret;
> void *data;
> int ok;
>
>
> I tried reducing my program to a simpler test case, but it's not as
> trivial. Am I looking at a GCC bug? What can I do to further track it
> down?
It may be a gcc bug.
The .i file after preprocessing would help. Use -save-temps to get it.
Are you using -Wall ?
Andrew.
More information about the Gcc-help
mailing list