Am Dienstag, dem 03.12.2024 um 14:31 +0000 schrieb Qing Zhao:
> 
> > On Dec 3, 2024, at 01:33, Martin Uecker <uec...@tugraz.at> wrote:
> > 
> > Am Montag, dem 02.12.2024 um 22:58 +0000 schrieb Qing Zhao:
> > > 
> > > > On Dec 2, 2024, at 16:13, Martin Uecker <uec...@tugraz.at> wrote:
> > > > 
> > > > Am Montag, dem 02.12.2024 um 20:15 +0000 schrieb Qing Zhao:
> > > > > 
> > > > > > On Nov 30, 2024, at 07:22, Martin Uecker <uec...@tugraz.at> wrote:
> > > > > > 
> > > > > > Am Dienstag, dem 26.11.2024 um 20:59 +0000 schrieb Qing Zhao:
> > > > > > > Think this over these days, I have another thought that need some 
> > > > > > > feedback:
> > > > > > > 
> > > > > > > The major issue right now is:
> > > > > > > 
> > > > > > > 1. For the following structure in which the “counted_by” 
> > > > > > > attributes is attached to the pointer field.
> > > > > > > 
> > > > > > > struct foo {
> > > > > > > int n;
> > > > > > > char *p __attribute__ ((counted_by (n)));
> > > > > > > } *x;
> > > > > > 
> > > > > > BTW: I also do not like the syntax 'n' for a lookup of a member 
> > > > > > in the member namespace. I think it should be '.n'.  For FAM this 
> > > > > > is less problematic because it always at the end, but here it is 
> > > > > > problematic.
> > > > > During my implementation of extending this attribute to pointer 
> > > > > fields of structure. 
> > > > > I didn’t notice  issue with the current syntax ’n’ for the pointer 
> > > > > fields so far, 
> > > > > even though when  the field “n” is declared after the corresponding 
> > > > > pointer field, i.e:
> > > > > 
> > > > > struct foo {
> > > > > {
> > > > > char *p __attribute__ ((counted_by (n)));
> > > > > int n;
> > > > > }
> > > > > 
> > > > > So, could you please explain a little bit more on what’s the 
> > > > > potential issue here?
> > > > 
> > > > My issue with it is that it is not consistent to how C's scoping
> > > > of identifiers work. In
> > > > 
> > > > constexpr int n = 3;
> > > > struct foo {
> > > > {
> > > > char (*p)[n] __attribute__ ((counted_by (n))
> > > > int n;
> > > > }
> > > > 
> > > > the n in the type of p refers to the previous n in scope while
> > > > the n in your attribute would refer to the member.
> > > 
> > > Okay, I see your point here -:).
> > > 
> > > Yes, I agree that if the compiler can accept the syntax “.n” in general, 
> > > then it will make the 
> > > “counted_by” attribute to allow more complicated expressions in general. 
> > > 
> > > We had this similar discussion before the design and implementation for 
> > > the “counted_by” attribute
> > > on FAMs, and we agreed to delay the approach of accepting the syntax “.n” 
> > > in the future possible 
> > > language standard at that time.
> > > 
> > > So, for the “counted_by attribute on FAMs, the implementation is, 
> > > searching the “n” in all the fields of the 
> > > containing structure and locating that specific field. 
> > > 
> > > Now, when extending “counted_by” attribute to pointer fields of 
> > > structures, the implementation is similar.
> > 
> > > > 
> > > > This is incoherent and confusing.  It becomes worse should
> > > > you ever want to allow more complicated expressions.
> > > 
> > > You are right, it’s hard to allow more complicated expressions for 
> > > “counted_by” based on the current
> > > design. 
> > > 
> > > If we agree to accept the “.n” syntax in GCC in general, that’s of course 
> > > better.
> > > Then how about the current “counted_by” for FAMs? Shall we also change it 
> > > to accept “.n” syntax?
> > 
> > My recommendation would be to change it.  It is also not ideal for 
> > this case - only less problematic.
> 
> If I remembered correctly, the “counted_by” attribute for FAM has been added 
> into Linux Kernel already. 
> Changing its syntax now also involves changing Linux Kernel source code. 
> 
> Kees, what’s your comments and suggestions for this?
> 
> Another issue is, we had the similar discussion before implementing the 
> “counted_by” attribute for FAM, at that time,
> We decided to use the current syntax, and CLANG also used the same syntax.  
> Changing the syntax for the “counted_by” attribute for FAM at this moment is 
> not very simple.

We could add the new syntax and still allow the old syntax only for the
FAM case (possibly deprecating it).

> 
> Why it’s LESS problematic for FAM case? (From implementation point of view, 
> they are the same for both FAM or pointer inside a structure).

Because the FAM is always last, so there is less room for confusion.
It is still annoying, which is why I pointed this out before.



> > 
> > > > 
> > > > It would be clearer if you the syntax ".n" which resembles
> > > > the syntax for designated initializers that is already used
> > > > in initializers to refer to struct members.
> > > > 
> > > > constexpr int n;
> > > > struct foo {
> > > > {
> > > > char (*p)[n] __attribute__ ((counted_by (.n))
> > > > int n;
> > > > }
> > > > 
> > > Yes, I agree. 
> > > > 
> > > > > 
> > > > > 
> > > > > > > 
> > > > > > > There is one important additional requirement:
> > > > > > > 
> > > > > > > x->n, x->p can ONLY be changed by changing the whole structure at 
> > > > > > > the same time. 
> > > > > > > Otherwise, x->n might not be consistent with x->p.
> > > > > > 
> > > > > > By itself, this would still not fix the issue I pointed out.
> > > > > > 
> > > > > > struct foo x;
> > > > > > x = .. ; // set the whole structure
> > > > > > char *p = x->p;
> > > > > > x = ... ; // set the whole structure
> > > > > > 
> > > > > > What is the bound for 'p' ?  
> > > > > 
> > > > > Since p was set to the pointer field of the old structure, then the 
> > > > > bound of it should be the old bound. 
> > > > > > With current rules it would be the old bound.
> > > > > 
> > > > > I thought that this should be the correct behavior, isn’t it?
> > > > 
> > > > Yes, sorry, what I meant was "with the current rules it would be
> > > > the *new* bound”.
> > > 
> > > struct foo x;
> > > x=… ;  // set the whole structure 1
> > > char *p = x->p;
> > > x=… ;  // set the whole structure 2
> > > 
> > > In the above, when “set the whole structure 1”, x1, x1->n and x1->p are 
> > > set at the same time;
> > > After *p = x->p;    the pointer “p” is pointing to “x1->p”, it’s bound is 
> > > “x1->n”;
> > 
> > I agree.
> > > 
> > > Then when “set the whole structure 2”, x2 is different than x1,  x2->n 
> > > and x2->p are set at the same time, the pointer
> > > ‘p’ still points to “x1->p”, therefore it’s bound should be “x1->n”. 
> > > 
> > > So, as long as the whole structure is set at the same time, should be 
> > > fine. 
> > > 
> > > Do I miss anything here?
> > 
> > I was talking aout the pointer "p" which was obtained before setting the
> > struct the second time in
> > 
> > char *p = x->p;
> > 
> > This pointer is still set to x1->p but the bound refers to x.n which is 
> > now set to x2->n.
> 
> You mean:
> 
> struct foo x;
> x=… ;  // set the whole structure 1
> char *p = x->p;
> x=… ;  // set the whole structure 2
> p[index] = 10;   // at this point, p’s bound is x2->n, not x1->n? 
> 
> Yes, you are right here. 
> 
> So, is there similar problem with the corresponding language extension? 
> 

The language extension does not exist yet, so there is no problem.

But I hope we will get it and then specify it so that this works
correctly without this footgun.

Of course, if GCC gets the "counted_by" attribute wrong, there will
be arguments later in WG14 why the feature is then different to it.

Martin


Reply via email to