On Thu, Jan 16, 2025 at 3:06 PM Qing Zhao <qing.z...@oracle.com> wrote: > > On Jan 16, 2025, at 17:29, Bill Wendling <isanb...@gmail.com> wrote: > > > > On Thu, Jan 16, 2025 at 1:19 PM Qing Zhao <qing.z...@oracle.com> wrote: > >> > >> Hi, > >> > >> This is the patch set to extend "counted_by" attribute to pointer fields > >> of structures. > >> > >> For example: > >> > >> struct PP { > >> size_t count2; > >> char other1; > >> char *array2 __attribute__ ((counted_by (count2))); > >> int other2; > >> } *pp; > >> > >> specifies that the "array2" is an array that is pointed by the > >> pointer field, and its number of elements is given by the field > >> "count2" in the same structure. > >> > >> Per the previous discussion with Martin and Bill > >> (https://gcc.gnu.org/pipermail/gcc-patches/2024-November/669320.html) > >> > >> there are the following importand facts about "counted_by" on pointer > >> fields compared > >> to the "counted_by" on FAM fields: > >> > >> 1. one more new requirement for pointer fields with "counted_by" attribute: > >> pp->array2 and pp->count2 can ONLY be changed by changing the whole > >> structure > >> at the same time. > >> > >> 2. the following feature for FAM field with "counted_by" attribute is NOT > >> valid for the pointer field any more: > >> > >> " One important feature of the attribute is, a reference to the > >> flexible array member field uses the latest value assigned to the > >> field that represents the number of the elements before that > >> reference. For example, > >> > >> p->count = val1; > >> p->array[20] = 0; // ref1 to p->array > >> p->count = val2; > >> p->array[30] = 0; // ref2 to p->array > >> > >> in the above, 'ref1' uses 'val1' as the number of the elements in > >> 'p->array', and 'ref2' uses 'val2' as the number of elements in > >> 'p->array'. " > >> > >> Although in the previous discussion, I agreed with Martin that we should > >> use the > >> designator syntax (i.e, counted_by (.n) instead of counted_by (n)) for the > >> counted_by attribute for pointer fields, after more consideration and > >> discussion > >> with Bill Wendling (who is working on the same work for CLANG), we decided > >> to > >> keep the current syntax of FAM for pointer fields. And leave the new > >> syntax (.n) > >> and more complicate expressions to a later work. > >> > >> This patch set includes 3 parts: > >> > >> 1.Extend "counted_by" attribute to pointer fields of structures. > >> 2.Convert a pointer reference with counted_by attribute to > >> .ACCESS_WITH_SIZE > >> and use it in builtinin-object-size. > >> 3.Use the counted_by attribute of pointers in array bound checker. > >> > >> In which, the patch 1 and 2 are simple and straightforward, however, the > >> patch 3 > >> is a little complicate due to the following reason: > >> > >> Current array bound checker only instruments ARRAY_REF, and the INDEX > >> information is the 2nd operand of the ARRAY_REF. > >> > >> When extending the array bound checker to pointer references with > >> counted_by attributes, the hardest part is to get the INDEX of the > >> corresponding array ref from the offset computation expression of > >> the pointer ref. > >> > >> The whole patch set has been bootstrapped and regression tested on both > >> aarch64 > >> and x86. > >> > >> Let me know any comments and suggestions. > >> > >> Thanks. > >> > >> Qing > >> > >> Qing Zhao (3): > >> Extend "counted_by" attribute to pointer fields of structures. > >> Convert a pointer reference with counted_by attribute to > >> .ACCESS_WITH_SIZE and use it in builtinin-object-size. > >> Use the counted_by attribute of pointers in array bound checker. > >> > >> gcc/c-family/c-attribs.cc | 15 +- > >> gcc/c-family/c-gimplify.cc | 7 + > >> gcc/c-family/c-ubsan.cc | 264 ++++++++++++++++-- > >> gcc/c/c-decl.cc | 91 +++--- > >> gcc/c/c-typeck.cc | 41 +-- > >> gcc/doc/extend.texi | 37 ++- > >> gcc/testsuite/gcc.dg/flex-array-counted-by.c | 2 +- > >> gcc/testsuite/gcc.dg/pointer-counted-by-2.c | 8 + > >> gcc/testsuite/gcc.dg/pointer-counted-by-3.c | 127 +++++++++ > >> gcc/testsuite/gcc.dg/pointer-counted-by-4.c | 63 +++++ > >> gcc/testsuite/gcc.dg/pointer-counted-by-5.c | 48 ++++ > >> gcc/testsuite/gcc.dg/pointer-counted-by-6.c | 47 ++++ > >> gcc/testsuite/gcc.dg/pointer-counted-by-7.c | 30 ++ > >> gcc/testsuite/gcc.dg/pointer-counted-by-8.c | 30 ++ > >> gcc/testsuite/gcc.dg/pointer-counted-by.c | 70 +++++ > > > > Do you have any tests where the 'count' field is after the pointer field? > > Yes. > > In /gcc/testsuite/gcc.dg/pointer-counted-by.c > > struct mixed_array_2 { > float *array_1 __attribute ((counted_by (count1))); > int count1; > float *array_2 __attribute ((counted_by (count1))); > long *array_3 __attribute ((counted_by (count2))); > int count2; > long array_4[] __attribute ((counted_by (count2))); > }; > > > count2 is After array_3. > > Though I might need to add more such cases. Will do that. > > Qing > Ah! Sorry about that. I missed that testcase.
-bw > >> .../ubsan/pointer-counted-by-bounds-2.c | 47 ++++ > >> .../ubsan/pointer-counted-by-bounds-3.c | 35 +++ > >> .../ubsan/pointer-counted-by-bounds-4.c | 35 +++ > >> .../ubsan/pointer-counted-by-bounds-5.c | 46 +++ > >> .../ubsan/pointer-counted-by-bounds-6.c | 33 +++ > >> .../gcc.dg/ubsan/pointer-counted-by-bounds.c | 46 +++ > >> gcc/tree-object-size.cc | 11 +- > >> 22 files changed, 1045 insertions(+), 88 deletions(-) > >> create mode 100644 gcc/testsuite/gcc.dg/pointer-counted-by-2.c > >> create mode 100644 gcc/testsuite/gcc.dg/pointer-counted-by-3.c > >> create mode 100644 gcc/testsuite/gcc.dg/pointer-counted-by-4.c > >> create mode 100644 gcc/testsuite/gcc.dg/pointer-counted-by-5.c > >> create mode 100644 gcc/testsuite/gcc.dg/pointer-counted-by-6.c > >> create mode 100644 gcc/testsuite/gcc.dg/pointer-counted-by-7.c > >> create mode 100644 gcc/testsuite/gcc.dg/pointer-counted-by-8.c > >> create mode 100644 gcc/testsuite/gcc.dg/pointer-counted-by.c > >> create mode 100644 gcc/testsuite/gcc.dg/ubsan/pointer-counted-by-bounds-2.c > >> create mode 100644 gcc/testsuite/gcc.dg/ubsan/pointer-counted-by-bounds-3.c > >> create mode 100644 gcc/testsuite/gcc.dg/ubsan/pointer-counted-by-bounds-4.c > >> create mode 100644 gcc/testsuite/gcc.dg/ubsan/pointer-counted-by-bounds-5.c > >> create mode 100644 gcc/testsuite/gcc.dg/ubsan/pointer-counted-by-bounds-6.c > >> create mode 100644 gcc/testsuite/gcc.dg/ubsan/pointer-counted-by-bounds.c > >> > >> -- > >> 2.31.1 > >