Re: [Intel-gfx] [PATCH 2/6] treewide: remove using list iterator after loop body as a ptr

David Laight
2022-03-01T03:03:59Z

From: Matthew Wilcox
> Sent: 28 February 2022 20:16
>
> On Mon, Feb 28, 2022 at 12:10:24PM -0800, Linus Torvalds wrote:
> > We can do
> >
> > typeof(pos) pos
> >
> > in the 'for ()' loop, and never use __iter at all.
> >
> > That means that inside the for-loop, we use a _different_ 'pos' than outside.
>
> Then we can never use -Wshadow ;-( I'd love to be able to turn it on;
> it catches real bugs.
>
> > +#define list_for_each_entry(pos, head, member) \
> > + for (typeof(pos) pos = list_first_entry(head, typeof(*pos), member); \
> > + !list_entry_is_head(pos, head, member); \
> > pos = list_next_entry(pos, member))

Actually can't you use 'pos' to temporarily hold the address of 'member'.
Something like:
for (pos = (void *)head; \
pos ? ((pos = (void *)pos - offsetof(member)), 1) : 0; \
pos = (void *)pos->next)
So that 'pos' is NULL if the loop terminates.
No pointers outside structures are generated.
Probably need to kill list_entry_is_head() - or it just checks for NULL.

David

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