On Fri, Sep 18, 2020 at 01:40:44PM -0700, Linus Torvalds wrote: > On Fri, Sep 18, 2020 at 1:29 PM Arvind Sankar <nivedita@xxxxxxxxxxxx> wrote: > > > > In general (i.e. outside the implementation of the macro itself), what > > is the preferred way of getting the size of just the header? > > 1) offsetof(typeof(s),flex) > > 2) struct_size(s, flex, 0) > > I think those two should end up being equivalent. Yeah, but it would be good to standardize on one of them. > > > 3) sizeof(s) > > This works right now, but exactly *because* it works, we're not seeing > the questionable cases. > > Of course, _also_ exactly because it just silently works, I also don't > know if there may be thousands of perfectly fine uses where people > really do want the header, and a "sizeof()" is simpler than > alternatives 1-2. > > It's possible that there really are a lot of "I want to know just the > header size" cases. It sounds odd, but I could _imagine_ situations > like that, even though no actual case comes to mind. I'm asking because I just added an instance of (3) and want to know if I should change it :) The case was when you have a function that got passed a pointer and a size, and wants to verify that the size covers the structure before accessing its fields. If the function only needs the "fixed" fields, it feels a little unnatural to use (1) or (2) when the flex member is otherwise not going be accessed at all. > > > 4) new macro that's easier to read than 1 or 2, but makes it clear > > what you're doing? > > I don't think this would have any real advantage, would it? The advantage is documenting that you do mean the header size, i.e. something like struct_header_size(s). > > Now what might be good is if we can make "struct_size()" also actually > verify that the member that is passed in is that last non-sized > member. I'm not sure how to do that. > > I know how to check that it's *not* that last unsized member (just do > "sizeof(s->flex)", and it should error), but I don't see how to assert > the reverse of that). > > Because that kind of "yes, we actually pass in the right member" check > would be good to have too. > > Linus You could just assert that offsetof(typeof(s),flex) == sizeof(s), no? It would also make sure that someone doesn't try to use struct_size() with a 1-sized array member.