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