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 0x10005. 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?