SafeStack proposal in GCC
Joel Sherrill
joel.sherrill@oarcorp.com
Mon May 9 20:08:00 GMT 2016
On 5/9/2016 3:03 PM, Michael Matz wrote:
> Hi,
>
> On Mon, 9 May 2016, Rich Felker wrote:
>
>>>> The *context APIs are deprecated and I'm not sure they're worth
>>>> supporting with this. It would be a good excuse to get people to
>>>> stop using them.
>>>
>>> How? POSIX decided to remove the facilities without any adequate
>>> replacement (thread aren't).
>>
>> Threads work just as well as the ucontext api for coroutines. Due to the
>> requirement to save/restore signal masks, the latter requires a syscall,
>> making it no faster than a voluntary context switch via futex syscall.
>
> Uhm, no. If you disregard efficiency, sure, POSIX threads are sometimes a
> replacement on some platforms. They still have completely different
> activation models (being synchronous with *context, for which you need
> even further slow synchronization in a threading model).
One complication on RTEMS which is a single process, multi-threaded RTOS
is that we can no longer check the stack bounds. For threads, we know
where the stack memory is and the range for each thread. For ucontext_t,
it seems this knowledge is unknown to the RTOS.
Thus it would become the responsibility of the run-time using ucontext_t
to put in fence patterns and check those.
>> Most of the other hacks people used the ucontext API for were complete
>> hacks with undefined behavior, anyway.
>
> Sure, that doesn't imply the facility should be removed. I can misuse all
> kinds of stuff.
>
>> BTW it's not even possible to implement makecontext on most targets due
>> to the wacky variadic calling convention it uses -- in most ABIs,
>> there's simply no way to shift the variadic args into the right slots
>> for calling the start function for the new context without knowing their
>> types, and the implementation has no way to know the types. So it's
>> really an unusably broken API.
>
> Of course. But _that_ implies that a workable replacement should have
> been put in place, not the unrealistic stance POSIX took with the removal:
> makecontext2(ucontext_t *ucp, void (*func)(void*), void* cookie);
> Done. I never understood why they left in the hugely
> unuseful {sig,}{set,long}jmp() but removed the actually useful *context()
> (amended somehow like above).
>
>
> Ciao,
> Michael.
>
--joel
More information about the Gcc
mailing list