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