> On Apr 4, 2025, at 04:59, Bill Wendling <isanb...@gmail.com> wrote:
> 
> On Thu, Apr 3, 2025 at 9:54 AM Kees Cook <k...@kernel.org> wrote:
>> On Wed, Apr 02, 2025 at 09:16:47PM +0000, Qing Zhao wrote:
>>> Hi, Bill,
>>> 
>>> Thanks for the summary.
>>> 
>>> I think that this is good.
>>> 
>>> Two more questions:
>>> 
>>> 1. Shall we keep the same name of the attribute counted_by for the 2nd new 
>>> syntax?
>>>    Or use a new name, such as, “counted_by_exp"?
>> 
>> FWIW, the Linux kernel will likely need to create its own macros for all
>> of this stuff (just to do the compiler version testing), so there should
>> be no problem with different names (or same names) in the compiler API.
>> 
>>>    I don’t have strong preference here. As mentioned by Jacub in a
>>>    previous email, these two syntaxes can be distinguished by the number
>>>    of arguments of the attribute.
>>> 
>>>    So for GCC, there should be no issue with either old name of a new name.
>>>    However, I am not sure about CLANG. (Considering the complication with 
>>> APPLE’s implementation)
> 
> I also don't have a strong opinion on whether we should add new
> '*_expr' attributes. It's pretty easy to determine a single identifier
> from a more complex expression, so it's probably okay to use the
> current name. (I think that's what Apple has been doing internally.)
> 
>>> 2. The 2nd new syntax should resolve all the following new requests from 
>>> Linux Kernel:
>>>  2.1 Refer to a field in the nested structure
>>>  2.2 Refer to globals or locals
>>>  2.3 Represent simple expression
>>>  2.4 Forward referencing
>>> 
>>> Except not very sure on 2.1: refer to a field in the nested structure
>>> 
>>> struct Y {
>>> int n;
>>> int other;
>>> }
>>> 
>>> struct Z {
>>> struct Y y;
>>> int array[]  __attribute__ ((counted_by(?y.n)));
>>> };
>>> 
>>> in the above, what should be put instead of "?" to refer to the field "n" 
>>> of the field "y" of the current object of this struct Z?
>>> 
>>> Based on my understanding, with the new syntax,
>>> 
>>> struct Z {
>>> struct Y y;
>>> int array[]  __attribute__ ((counted_by(struct Y y, y.n)));
>>> };
>>> 
>>> i.e, the compiler will lookup “y” inside the current structure, then 
>>> resolving the member access operator “.” as an expression.
>>> 
>>> Is this correct understanding?
>> 
>> I had the same question, e.g. how is this supposed to be declared:
>> 
>> struct Y {
>>  int n;
>>  int other;
>> }
>> 
>> struct Z {
>>  int *ints __attribute__ ((counted_by(y.n)));
>>  struct Y y;
>> };
>> 
> My initial thought is that you'd have something like this:
> 
> struct Y {
>  int n;
> };
> 
> struct Z {
>  int *ints __attrbiute__((counted_by(struct Y y; y.n)));
>  struct Y y;
> };
> 
> And it should "just work." I'm not sure if there's an issue with this though.

Yes, I think that “y.n” is an expression, not an identifier, so, forward 
declaration is needed.
Which forward declaration, “y” is looked up inside the structure, . Is parsed 
as a regular
member access operator.  So, everything works smoothly.

Qing
> 
> -bw


Reply via email to