On Tue, Mar 05, 2019 at 09:36:56PM +0100, David Brown wrote:
> On 05/03/2019 19:37, Segher Boessenkool wrote:
> >On Mon, Mar 04, 2019 at 09:45:37PM +0100, David Brown wrote:
> >>void foo(void) {
> >> char key[20];
> >> strcpy(key, "Top secret");
> >> usekey(key);
> >> memset(key, 0, sizeof(key));
> >> {
> >> typedef struct { char x[20]; } XS;
> >> XS *p = (XS *) key;
> >> asm("" : "+m" (*p));
> >> }
> >>}
> >
> >You need to use "asm volatile" here. In principle GCC can see all the
> >outputs of the asm are dead and delete all of the asm, otherwise. But
> >you don't need an output for *p (or inout as you wrote), just an input
> >is fine.
>
> There are no outputs from this asm - only an input.
"+m" is an output. There is only one colon before it, and besides, "+"
is only allowed on outputs.
Segher