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?

Reply via email to