[PATCH] strace: Fix crash caused over-optimization

Daniel Santos daniel.santos@pobox.com
Wed Apr 19 15:52:00 GMT 2017


On 04/18/2017 05:04 AM, Corinna Vinschen wrote:
> On Apr 17 03:39, Daniel Santos wrote:
>
>> I actually did try that, although I had guessed it wouldn't (and shouldn't)
>> work.  I believe that the reason is that rather the accesses are volatile or
>> not, gcc can see nothing else using it and memset can be a treated as a
>> compiler built-in (per the C spec, maybe C89?), so it can presume the
>> outcome.  If there's a cleaner way to do this, I would really love to learn
>> that.  __attribute__ ((used)) only works on variables with static storage.
>>
>> Now I suspect that I may have found a little bug in gcc, because if I call
>> memset by casting it directly as a volatile function pointer, it is still
>> optimized away, and it should not:
>>
>>    ((void *(*volatile)(void *, int, size_t))memset) (buf, 0, sizeof (buf));
>>
>> And most interestingly, if I first assign a local volatile function pointer
>> to the address, then gcc properly does *not* optimize it away:
>>
>>    void *(*volatile vol_memset)(void *, int, size_t) = memset;
>>    vol_memset (buf, 0, sizeof (buf));
>>
>> I'm actually really glad for your response and that I played with this
>> because I need to make sure that this problem doesn't exist in gcc7.  I have
>> changes going into gcc8 shortly and this could mask problems from my test
>> program where I cast functions as volatile w/o assigning using a local.
>>
>> Daniel
> What about using RtlSecureZeroMemory instead?
>
>
> Corinna

Well that's surprising.  Yes, it does solve the problem and I presume 
would be more portable. :)  It even inlines the "memset", but uses a 
single byte rep stos.  Technically, I think that a double-word stos 
could be used in this case, but I doubt that matters much.

Daniel



More information about the Cygwin-patches mailing list