RE: [GIT PULL] tracing: Updates for 5.2

From: David Laight
Date: Thu May 16 2019 - 05:10:16 EST


> This code:
>
> /* reset all but tr, trace, and overruns */
> memset(&iter.seq, 0,
> sizeof(struct trace_iterator) -
> offsetof(struct trace_iterator, seq));
>
> not only has a completely misleading comment (it resets a lot more
> than the comment states), but modern gcc looks at that code and says
> "oh, you're passing it a pointer to 'iter.seq', but then clearing a
> lot more than a 'trace_seq'":
>
> In function âmemsetâ,
> inlined from âftrace_dumpâ at kernel/trace/trace.c:8914:3:
> /include/linux/string.h:344:9: warning: â__builtin_memsetâ offset
> [8505, 8560] from the object at âiterâ is out of the bounds of
> referenced subobject âseqâ with type âstruct trace_seqâ at offset 4368
> [-Warray-bounds]
> 344 | return __builtin_memset(p, c, size);
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> It's a somewhat annoying warning because the code itself is
> technically correct, but at the same time, I think the gcc warning is
> reasonable. You *are* passing it a 'struct trace_seq' pointer, and
> then you're clearing a whole lot more than that.
>
> One option is to just rewrite it something like
>
> const unsigned int offset = offsetof(struct trace_iterator, seq);
> memset(offset+(void *)&iter, 0, sizeof(iter) - offset);

I'd do (const char *)&iter + offset ...

A quick fix is (probably) just:
memset((void *)(long)&iter.seq, ...

David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)