On Tue, Oct 9, 2012 at 10:16 AM, David Chisnall <thera...@freebsd.org> wrote:
> On 9 Oct 2012, at 17:33, Andrey Chernov wrote:
>
>> Do you check assembler output for _both_ cases?
>> In my testing clang and gcc xor's 'junk' properly in case it have
>> 'volatile' keyword (as in srandomdev()) and elide it without 'volatile'.
>> IMHO this change should be backed out for srandomdev() and adding
>> 'volatile' for sranddev() instead.
>
> In it's original form, it is very dangerous - the whole expression reduces to 
> undefined and so the LLVM IR for the call is:
>
> call void @srand(i32 undef)
>
> The back end is then free to use any value for the call argument, including 
> any register value or 0.  Since the value is passed in a register, it will 
> probably just use whatever the last value there is, which may or may not be 
> anything sensible.  On MIPS, for example, this is most likely to be &tv, and 
> so is 100% deterministic.
>
> Adding the volatile means that we are doing an XOR with a value left on the 
> stack.  If this is early on in the application, then it is most likely to be 
> 0.  If it's later on, then there may be a value here, but it's still not very 
> likely to be something particularly unpredictable.
>

The original behavior can be recovered by using inline assembly to
fetch the value from a register into a local C variable; this would at
least not rely on undefined behavior.  But I agree it's of dubious
value anyways.
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to