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]); }; -bw