On Thu, Dec 5, 2024 at 2:37 PM Martin Uecker <uec...@tugraz.at> wrote:
>
> 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).
>
I agree. That way lies madness.

-bw

Reply via email to