http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56621
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |RESOLVED CC| |jakub at gcc dot gnu.org Resolution| |INVALID --- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> 2013-03-14 18:58:12 UTC --- No, that is just bogus inline asm, for multiple reasons. message_size is 32-bit, so using movq on it means you can end up with arbitrary garbage in the high 32-bits. E.g. I see: write(1, "test\n\0\0\0\5\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0005\27\202\351?\0\0\0"..., 4294967301) = -1 EFAULT (Bad address) where 4294967301 is 0x100000005. You'd want movl instead, which will zero the upper 32 bits. Also, nothing tells the compiler that the clobbered registers are clobbered before consuming the inputs, the compiler could assign one of the two inputs to the clobbered registers. Better just use long dummy; int dummy2; ... "=S" (dummy), "=d" (dummy2) ... : "0" (message), "1" (message_size) ... then you don't need to do any of the bogus moves first, the compiler will arrange all of that. Or why aren't you just using syscall function, or write?