Am Donnerstag, dem 05.12.2024 um 14:28 -0800 schrieb Bill Wendling:
> On Thu, Dec 5, 2024 at 1:09 PM Qing Zhao <qing.z...@oracle.com> wrote:
> > > On Dec 3, 2024, at 10:29, Qing Zhao <qing.z...@oracle.com> wrote:
> > > > On Dec 3, 2024, at 10:07, Martin Uecker <uec...@tugraz.at> wrote:
> > > > The language extension does not exist yet, so there is no problem.
> > > Yeah, I should mention this as “corresponding future language extension” 
> > > -:)
> > > > 
> > > > 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.
> > > 
> > > I think that we need to resolve this issue first in the design of 
> > > “counted_by” for pointer fields.
> > > I guess that we might need to come up with some additional limitations 
> > > for using the “counted_by”
> > > attribute for pointer fields at the source code level in order to avoid 
> > > such potential error.  But not
> > > sure what exactly the additional limitation should be at this moment.
> > > 
> > > Need some study here.
> > 
> > Actually, I found out that this is really not a problem with the current 
> > design, for the following new testing case I added for my current 
> > implementation of the counted_by for pointer field:
> > 
> > [ gcc.dg]$ cat pointer-counted-by-7.c
> > /* Test the attribute counted_by for pointer field and its usage in
> >  * __builtin_dynamic_object_size.  */
> > /* { dg-do run } */
> > /* { dg-options "-O2" } */
> > 
> > #include "builtin-object-size-common.h"
> > 
> > struct annotated {
> >   int b;
> >   int *c __attribute__ ((counted_by (b)));
> > };
> > 
> > struct annotated *__attribute__((__noinline__)) setup (int attr_count)
> > {
> >   struct annotated *p_array_annotated
> >     = (struct annotated *) malloc (sizeof (struct annotated));
> >   p_array_annotated->c = (int *) malloc (sizeof (int) * attr_count);
> >   p_array_annotated->b = attr_count;
> > 
> >   return p_array_annotated;
> > }
> > 
> > 
> > int main(int argc, char *argv[])
> > {
> >   struct annotated *x = setup (10);
> >   int *p = x->c;
> >   x = setup (20);
> >   EXPECT(__builtin_dynamic_object_size (p, 1), 10 * sizeof (int));
> >   EXPECT(__builtin_dynamic_object_size (x->c, 1), 20 * sizeof (int));
> >   DONE ();
> > }
> > 
> > This test case passed without any issue.
> > 
> > Our previous introduction of the new internal function .ACCESS_WITH_SIZE 
> > already resolved this issue.
> > 
> > So, I think that as long as the whole structure is set at the same time, 
> > should be fine.
> > 
> > Let me know if you have more comment here.
> > 
> Nice! I think this is going to be an issue with Clang's
> implementation. I'll need to create our version of .ACCESS_WITH_SIZE.
> It might end up simplifying some of the code. :-)
> 
> Martin,
> 
> A question about the WG14 proposal (using the designated initializer
> syntax for __counted_by). Would the proposal support arbitrary
> "expressions" (for lack of a better word) into the struct? For
> example, could one have something like:
> 
> struct s {
>   struct count_struct {
>     int count[32];
>   } c;
>   int array[] __counted_by(.c.count[3]);
> };

I guess it could make sense to allow the same constructions as
for designated initializers.

I would not allow any other expressions (or maybe only some
very restricted froms, but definitely no function calls).

Martin


Reply via email to