Alignment issue on x86_64?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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).

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? Would *.s output for that particular C file help?

Am I in the right place for such issues?

Thanks in advance for any pointers or help

--
Rémi Cardona
LRI, INRIA
remi.cardona@xxxxxx
remi@xxxxxxxxxx

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux