lkml.org 
[lkml]   [2019]   [May]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
SubjectRE: [GIT PULL] tracing: Updates for 5.2
Date
> 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)
\
 
 \ /
  Last update: 2019-05-16 11:08    [W:0.046 / U:3.132 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site