On 08/23/2017 03:07 AM, Richard Biener wrote: >>> Both -fstack-clash-protection and -fstack-check cannot be turned >>> off per function. This means they would need merging in lto-wrapper. >>> The alternative is to mark them with 'Optimization' and allow per-function >>> specification (like we do for -fstack-protector). >> Do you have a strong preference here? I'd tend to go with tweaking >> lto-wrapper as we really don't want to have this stuff varying per-function. > > Any reason? I see no technical one at least, it might break IPA assumptions > you make when instrumenting? I guess you just don't want to think about > the implications when mixing them (or mixing -fstack-clash-protection > with -fno-stack-clash-protection)? On some targets (s390 for example), a stack guard jump can be accomplished by a combination of caller and callee stack adjustments -- even though neither the caller nor the callee have a large enough adjustment individually to jump the guard.
So a mis-informed developer could audit their code, declare various functions as safe & turn off protections on a per-function basis based on that analysis. But that would be mis-guided as it opens them up to a potential attack where the combination of caller and callee stack adjustments are used to jump the guard. > >> Presumably in lto-wrapper we just have to detect that both were enabled >> and do something sensible. We drop -fstack-check in toplev.c when both >> are specified, we could just as easily call that situation a fatal error >> in both toplev.c and lto-wrapper.c > > So what happens if you LTO link Ada (-fstack-check) with C > (-fstack-clash-protection)? When in the Ada code you'll be mostly protected from stack clashes and you can detect stack overflows and catch the signal properly. When in C code, you'd be fully protected from stack clash, but not necessarily able to take a signal. At the boundaries where you call from Ada to C, you're potentially vulnerable to stack clash on architectures like aarch64/s390. When calling from C into Ada, you're not guaranteed to be able to handle a signal when you overflow the stack. > The user is already allowed to (without LTO) specify things on a CU granularity. True. And you end up with a mixture of protections depending on what code is executing or what boundary you're crossing. Jeff