diff mbox series

[v2,2/3] docs/misra/rules.rst: add rule 5.5

Message ID 20240213223334.3693410-2-stefano.stabellini@amd.com (mailing list archive)
State New
Headers show
Series [v2,1/3] docs/misra/rules.rst: add rule 16.6 and 20.12 | expand

Commit Message

Stefano Stabellini Feb. 13, 2024, 10:33 p.m. UTC
Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
---
 docs/misra/rules.rst | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Jan Beulich Feb. 14, 2024, 8:28 a.m. UTC | #1
On 13.02.2024 23:33, Stefano Stabellini wrote:
> Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
> ---
>  docs/misra/rules.rst | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
> index c185366966..931158b354 100644
> --- a/docs/misra/rules.rst
> +++ b/docs/misra/rules.rst
> @@ -181,6 +181,12 @@ maintainers if you want to suggest a change.
>         headers (xen/include/public/) are allowed to retain longer
>         identifiers for backward compatibility.
>  
> +   * - `Rule 5.5 <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
> +     - Required
> +     - Identifiers shall be distinct from macro names
> +     - Clashes between function-like macros and non-callable entities
> +       are allowed. The pattern #define x x is also allowed.

Just for me to know what exactly is covered (hence also a question
to Roberto as to [to be] implemented Eclair behavior): Even when
the above would be sufficient (and imo better) people frequently
write

#define a(x, y) b(x, y)

which, transformed to the specific case here, would then be

#define a(x, y) a(x, y)

I'd assume such ought to also be covered, but that's not clear
from the spelling above.

Jan
Federico Serafini Feb. 14, 2024, 11:27 a.m. UTC | #2
On 14/02/24 09:28, Jan Beulich wrote:
> On 13.02.2024 23:33, Stefano Stabellini wrote:
>> Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
>> ---
>>   docs/misra/rules.rst | 6 ++++++
>>   1 file changed, 6 insertions(+)
>>
>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
>> index c185366966..931158b354 100644
>> --- a/docs/misra/rules.rst
>> +++ b/docs/misra/rules.rst
>> @@ -181,6 +181,12 @@ maintainers if you want to suggest a change.
>>          headers (xen/include/public/) are allowed to retain longer
>>          identifiers for backward compatibility.
>>   
>> +   * - `Rule 5.5 <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
>> +     - Required
>> +     - Identifiers shall be distinct from macro names
>> +     - Clashes between function-like macros and non-callable entities
>> +       are allowed. The pattern #define x x is also allowed.
> 
> Just for me to know what exactly is covered (hence also a question
> to Roberto as to [to be] implemented Eclair behavior): Even when
> the above would be sufficient (and imo better) people frequently
> write
> 
> #define a(x, y) b(x, y)
> 
> which, transformed to the specific case here, would then be
> 
> #define a(x, y) a(x, y)
> 
> I'd assume such ought to also be covered, but that's not clear
> from the spelling above.

I list what happens in some different situations,
then we can find the right words for the documentation and/or
refine the configuration:

If you
#define x x
and then use `x' as identifier,
the resulting violation is deviated (allowed pattern).

If you
#define a(x, y) a(x, y)
and then use `a' as identifier for a non-callable entity,
the resulting violation is deviated (no clash with non-callable
entities).
If you use identifier `a' for a callable entity, the resulting violation
is reported: the allowed pattern covers only macros expanding to their
own name, in this case the macro name is considered to be
`a' only, not a(x, y).

If you
#define a(x, y) b(x, y)
and then use `a' as identifier for a non-callable entity,
the resulting violation is deviated (no clash with non-callable
entities).
If you use `a' as identifier for a callable entity,
this is not a violation because after the preprocessing phase,
identifier `a' no longer exists.

As far as I know, this is what was agreed upon in one of the recent
MISRA meetings.
Jan Beulich Feb. 14, 2024, 1:15 p.m. UTC | #3
On 14.02.2024 12:27, Federico Serafini wrote:
> On 14/02/24 09:28, Jan Beulich wrote:
>> On 13.02.2024 23:33, Stefano Stabellini wrote:
>>> Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
>>> ---
>>>   docs/misra/rules.rst | 6 ++++++
>>>   1 file changed, 6 insertions(+)
>>>
>>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
>>> index c185366966..931158b354 100644
>>> --- a/docs/misra/rules.rst
>>> +++ b/docs/misra/rules.rst
>>> @@ -181,6 +181,12 @@ maintainers if you want to suggest a change.
>>>          headers (xen/include/public/) are allowed to retain longer
>>>          identifiers for backward compatibility.
>>>   
>>> +   * - `Rule 5.5 <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
>>> +     - Required
>>> +     - Identifiers shall be distinct from macro names
>>> +     - Clashes between function-like macros and non-callable entities
>>> +       are allowed. The pattern #define x x is also allowed.
>>
>> Just for me to know what exactly is covered (hence also a question
>> to Roberto as to [to be] implemented Eclair behavior): Even when
>> the above would be sufficient (and imo better) people frequently
>> write
>>
>> #define a(x, y) b(x, y)
>>
>> which, transformed to the specific case here, would then be
>>
>> #define a(x, y) a(x, y)
>>
>> I'd assume such ought to also be covered, but that's not clear
>> from the spelling above.
> 
> I list what happens in some different situations,
> then we can find the right words for the documentation and/or
> refine the configuration:
> 
> If you
> #define x x
> and then use `x' as identifier,
> the resulting violation is deviated (allowed pattern).
> 
> If you
> #define a(x, y) a(x, y)
> and then use `a' as identifier for a non-callable entity,
> the resulting violation is deviated (no clash with non-callable
> entities).
> If you use identifier `a' for a callable entity, the resulting violation
> is reported: the allowed pattern covers only macros expanding to their
> own name, in this case the macro name is considered to be
> `a' only, not a(x, y).
> 
> If you
> #define a(x, y) b(x, y)
> and then use `a' as identifier for a non-callable entity,
> the resulting violation is deviated (no clash with non-callable
> entities).

I'm afraid I don't see what violation there is in this case, to
deviate. As a result I'm also not sure I correctly understand the
rest of your reply.

> If you use `a' as identifier for a callable entity,
> this is not a violation because after the preprocessing phase,
> identifier `a' no longer exists.
> 
> As far as I know, this is what was agreed upon in one of the recent
> MISRA meetings.

That was my fear (of being what I'd call a wrong [insufficient]
interpretation of what was meant).

Jan
Federico Serafini Feb. 14, 2024, 1:56 p.m. UTC | #4
On 14/02/24 14:15, Jan Beulich wrote:
> On 14.02.2024 12:27, Federico Serafini wrote:
>> On 14/02/24 09:28, Jan Beulich wrote:
>>> On 13.02.2024 23:33, Stefano Stabellini wrote:
>>>> Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
>>>> ---
>>>>    docs/misra/rules.rst | 6 ++++++
>>>>    1 file changed, 6 insertions(+)
>>>>
>>>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
>>>> index c185366966..931158b354 100644
>>>> --- a/docs/misra/rules.rst
>>>> +++ b/docs/misra/rules.rst
>>>> @@ -181,6 +181,12 @@ maintainers if you want to suggest a change.
>>>>           headers (xen/include/public/) are allowed to retain longer
>>>>           identifiers for backward compatibility.
>>>>    
>>>> +   * - `Rule 5.5 <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
>>>> +     - Required
>>>> +     - Identifiers shall be distinct from macro names
>>>> +     - Clashes between function-like macros and non-callable entities
>>>> +       are allowed. The pattern #define x x is also allowed.
>>>
>>> Just for me to know what exactly is covered (hence also a question
>>> to Roberto as to [to be] implemented Eclair behavior): Even when
>>> the above would be sufficient (and imo better) people frequently
>>> write
>>>
>>> #define a(x, y) b(x, y)
>>>
>>> which, transformed to the specific case here, would then be
>>>
>>> #define a(x, y) a(x, y)
>>>
>>> I'd assume such ought to also be covered, but that's not clear
>>> from the spelling above.
>>
>> I list what happens in some different situations,
>> then we can find the right words for the documentation and/or
>> refine the configuration:
>>
>> If you
>> #define x x
>> and then use `x' as identifier,
>> the resulting violation is deviated (allowed pattern).
>>
>> If you
>> #define a(x, y) a(x, y)
>> and then use `a' as identifier for a non-callable entity,
>> the resulting violation is deviated (no clash with non-callable
>> entities).
>> If you use identifier `a' for a callable entity, the resulting violation
>> is reported: the allowed pattern covers only macros expanding to their
>> own name, in this case the macro name is considered to be
>> `a' only, not a(x, y).
>>
>> If you
>> #define a(x, y) b(x, y)
>> and then use `a' as identifier for a non-callable entity,
>> the resulting violation is deviated (no clash with non-callable
>> entities).
> 
> I'm afraid I don't see what violation there is in this case, to
> deviate. As a result I'm also not sure I correctly understand the
> rest of your reply.

#define a(x, y) b(x, y)

int a; // Violation of Rule 5.5.

The macro name `a' that exist before the preprocessing phase,
still exists after the preprocessing phase as identifier for the integer
variable and this is a violation.

>> If you use `a' as identifier for a callable entity,
>> this is not a violation because after the preprocessing phase,
>> identifier `a' no longer exists.
I correct myself:
if you use `a' as identifier for a *function*,
it is not a violation because after the preprocessing phase
the identifier `a' no longer exists, for example:

#define a(x, y) b(x, y)

void a(int x, int y); // Ok.
Stefano Stabellini Feb. 29, 2024, 11:28 p.m. UTC | #5
On Wed, 14 Feb 2024, Federico Serafini wrote:
> On 14/02/24 14:15, Jan Beulich wrote:
> > On 14.02.2024 12:27, Federico Serafini wrote:
> > > On 14/02/24 09:28, Jan Beulich wrote:
> > > > On 13.02.2024 23:33, Stefano Stabellini wrote:
> > > > > Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
> > > > > ---
> > > > >    docs/misra/rules.rst | 6 ++++++
> > > > >    1 file changed, 6 insertions(+)
> > > > > 
> > > > > diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
> > > > > index c185366966..931158b354 100644
> > > > > --- a/docs/misra/rules.rst
> > > > > +++ b/docs/misra/rules.rst
> > > > > @@ -181,6 +181,12 @@ maintainers if you want to suggest a change.
> > > > >           headers (xen/include/public/) are allowed to retain longer
> > > > >           identifiers for backward compatibility.
> > > > >    +   * - `Rule 5.5
> > > > > <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
> > > > > +     - Required
> > > > > +     - Identifiers shall be distinct from macro names
> > > > > +     - Clashes between function-like macros and non-callable entities
> > > > > +       are allowed. The pattern #define x x is also allowed.
> > > > 
> > > > Just for me to know what exactly is covered (hence also a question
> > > > to Roberto as to [to be] implemented Eclair behavior): Even when
> > > > the above would be sufficient (and imo better) people frequently
> > > > write
> > > > 
> > > > #define a(x, y) b(x, y)
> > > > 
> > > > which, transformed to the specific case here, would then be
> > > > 
> > > > #define a(x, y) a(x, y)
> > > > 
> > > > I'd assume such ought to also be covered, but that's not clear
> > > > from the spelling above.
> > > 
> > > I list what happens in some different situations,
> > > then we can find the right words for the documentation and/or
> > > refine the configuration:
> > > 
> > > If you
> > > #define x x
> > > and then use `x' as identifier,
> > > the resulting violation is deviated (allowed pattern).
> > > 
> > > If you
> > > #define a(x, y) a(x, y)
> > > and then use `a' as identifier for a non-callable entity,
> > > the resulting violation is deviated (no clash with non-callable
> > > entities).
> > > If you use identifier `a' for a callable entity, the resulting violation
> > > is reported: the allowed pattern covers only macros expanding to their
> > > own name, in this case the macro name is considered to be
> > > `a' only, not a(x, y).
> > > 
> > > If you
> > > #define a(x, y) b(x, y)
> > > and then use `a' as identifier for a non-callable entity,
> > > the resulting violation is deviated (no clash with non-callable
> > > entities).
> > 
> > I'm afraid I don't see what violation there is in this case, to
> > deviate. As a result I'm also not sure I correctly understand the
> > rest of your reply.
> 
> #define a(x, y) b(x, y)
> 
> int a; // Violation of Rule 5.5.
> 
> The macro name `a' that exist before the preprocessing phase,
> still exists after the preprocessing phase as identifier for the integer
> variable and this is a violation.
> 
> > > If you use `a' as identifier for a callable entity,
> > > this is not a violation because after the preprocessing phase,
> > > identifier `a' no longer exists.
> I correct myself:
> if you use `a' as identifier for a *function*,
> it is not a violation because after the preprocessing phase
> the identifier `a' no longer exists, for example:
> 
> #define a(x, y) b(x, y)
> 
> void a(int x, int y); // Ok.

Federico, do you have a better wording suggestion for this rule?

Jan, any further requests here? What would you like to see as next step?
Jan Beulich March 1, 2024, 8:06 a.m. UTC | #6
On 01.03.2024 00:28, Stefano Stabellini wrote:
> On Wed, 14 Feb 2024, Federico Serafini wrote:
>> On 14/02/24 14:15, Jan Beulich wrote:
>>> On 14.02.2024 12:27, Federico Serafini wrote:
>>>> On 14/02/24 09:28, Jan Beulich wrote:
>>>>> On 13.02.2024 23:33, Stefano Stabellini wrote:
>>>>>> Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
>>>>>> ---
>>>>>>    docs/misra/rules.rst | 6 ++++++
>>>>>>    1 file changed, 6 insertions(+)
>>>>>>
>>>>>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
>>>>>> index c185366966..931158b354 100644
>>>>>> --- a/docs/misra/rules.rst
>>>>>> +++ b/docs/misra/rules.rst
>>>>>> @@ -181,6 +181,12 @@ maintainers if you want to suggest a change.
>>>>>>           headers (xen/include/public/) are allowed to retain longer
>>>>>>           identifiers for backward compatibility.
>>>>>>    +   * - `Rule 5.5
>>>>>> <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
>>>>>> +     - Required
>>>>>> +     - Identifiers shall be distinct from macro names
>>>>>> +     - Clashes between function-like macros and non-callable entities
>>>>>> +       are allowed. The pattern #define x x is also allowed.
>>>>>
>>>>> Just for me to know what exactly is covered (hence also a question
>>>>> to Roberto as to [to be] implemented Eclair behavior): Even when
>>>>> the above would be sufficient (and imo better) people frequently
>>>>> write
>>>>>
>>>>> #define a(x, y) b(x, y)
>>>>>
>>>>> which, transformed to the specific case here, would then be
>>>>>
>>>>> #define a(x, y) a(x, y)
>>>>>
>>>>> I'd assume such ought to also be covered, but that's not clear
>>>>> from the spelling above.
>>>>
>>>> I list what happens in some different situations,
>>>> then we can find the right words for the documentation and/or
>>>> refine the configuration:
>>>>
>>>> If you
>>>> #define x x
>>>> and then use `x' as identifier,
>>>> the resulting violation is deviated (allowed pattern).
>>>>
>>>> If you
>>>> #define a(x, y) a(x, y)
>>>> and then use `a' as identifier for a non-callable entity,
>>>> the resulting violation is deviated (no clash with non-callable
>>>> entities).
>>>> If you use identifier `a' for a callable entity, the resulting violation
>>>> is reported: the allowed pattern covers only macros expanding to their
>>>> own name, in this case the macro name is considered to be
>>>> `a' only, not a(x, y).
>>>>
>>>> If you
>>>> #define a(x, y) b(x, y)
>>>> and then use `a' as identifier for a non-callable entity,
>>>> the resulting violation is deviated (no clash with non-callable
>>>> entities).
>>>
>>> I'm afraid I don't see what violation there is in this case, to
>>> deviate. As a result I'm also not sure I correctly understand the
>>> rest of your reply.
>>
>> #define a(x, y) b(x, y)
>>
>> int a; // Violation of Rule 5.5.
>>
>> The macro name `a' that exist before the preprocessing phase,
>> still exists after the preprocessing phase as identifier for the integer
>> variable and this is a violation.
>>
>>>> If you use `a' as identifier for a callable entity,
>>>> this is not a violation because after the preprocessing phase,
>>>> identifier `a' no longer exists.
>> I correct myself:
>> if you use `a' as identifier for a *function*,
>> it is not a violation because after the preprocessing phase
>> the identifier `a' no longer exists, for example:
>>
>> #define a(x, y) b(x, y)
>>
>> void a(int x, int y); // Ok.
> 
> Federico, do you have a better wording suggestion for this rule?
> 
> Jan, any further requests here? What would you like to see as next step?

A more concise wording proposal would probably help.

Jan
Federico Serafini March 4, 2024, 1:31 p.m. UTC | #7
On 01/03/24 09:06, Jan Beulich wrote:
> On 01.03.2024 00:28, Stefano Stabellini wrote:
>> On Wed, 14 Feb 2024, Federico Serafini wrote:
>>> On 14/02/24 14:15, Jan Beulich wrote:
>>>> On 14.02.2024 12:27, Federico Serafini wrote:
>>>>> On 14/02/24 09:28, Jan Beulich wrote:
>>>>>> On 13.02.2024 23:33, Stefano Stabellini wrote:
>>>>>>> Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
>>>>>>> ---
>>>>>>>     docs/misra/rules.rst | 6 ++++++
>>>>>>>     1 file changed, 6 insertions(+)
>>>>>>>
>>>>>>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
>>>>>>> index c185366966..931158b354 100644
>>>>>>> --- a/docs/misra/rules.rst
>>>>>>> +++ b/docs/misra/rules.rst
>>>>>>> @@ -181,6 +181,12 @@ maintainers if you want to suggest a change.
>>>>>>>            headers (xen/include/public/) are allowed to retain longer
>>>>>>>            identifiers for backward compatibility.
>>>>>>>     +   * - `Rule 5.5
>>>>>>> <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
>>>>>>> +     - Required
>>>>>>> +     - Identifiers shall be distinct from macro names
>>>>>>> +     - Clashes between function-like macros and non-callable entities
>>>>>>> +       are allowed. The pattern #define x x is also allowed.
>>>>>>
>>>>>> Just for me to know what exactly is covered (hence also a question
>>>>>> to Roberto as to [to be] implemented Eclair behavior): Even when
>>>>>> the above would be sufficient (and imo better) people frequently
>>>>>> write
>>>>>>
>>>>>> #define a(x, y) b(x, y)
>>>>>>
>>>>>> which, transformed to the specific case here, would then be
>>>>>>
>>>>>> #define a(x, y) a(x, y)
>>>>>>
>>>>>> I'd assume such ought to also be covered, but that's not clear
>>>>>> from the spelling above.
>>>>>
>>>>> I list what happens in some different situations,
>>>>> then we can find the right words for the documentation and/or
>>>>> refine the configuration:
>>>>>
>>>>> If you
>>>>> #define x x
>>>>> and then use `x' as identifier,
>>>>> the resulting violation is deviated (allowed pattern).
>>>>>
>>>>> If you
>>>>> #define a(x, y) a(x, y)
>>>>> and then use `a' as identifier for a non-callable entity,
>>>>> the resulting violation is deviated (no clash with non-callable
>>>>> entities).
>>>>> If you use identifier `a' for a callable entity, the resulting violation
>>>>> is reported: the allowed pattern covers only macros expanding to their
>>>>> own name, in this case the macro name is considered to be
>>>>> `a' only, not a(x, y).
>>>>>
>>>>> If you
>>>>> #define a(x, y) b(x, y)
>>>>> and then use `a' as identifier for a non-callable entity,
>>>>> the resulting violation is deviated (no clash with non-callable
>>>>> entities).
>>>>
>>>> I'm afraid I don't see what violation there is in this case, to
>>>> deviate. As a result I'm also not sure I correctly understand the
>>>> rest of your reply.
>>>
>>> #define a(x, y) b(x, y)
>>>
>>> int a; // Violation of Rule 5.5.
>>>
>>> The macro name `a' that exist before the preprocessing phase,
>>> still exists after the preprocessing phase as identifier for the integer
>>> variable and this is a violation.
>>>
>>>>> If you use `a' as identifier for a callable entity,
>>>>> this is not a violation because after the preprocessing phase,
>>>>> identifier `a' no longer exists.
>>> I correct myself:
>>> if you use `a' as identifier for a *function*,
>>> it is not a violation because after the preprocessing phase
>>> the identifier `a' no longer exists, for example:
>>>
>>> #define a(x, y) b(x, y)
>>>
>>> void a(int x, int y); // Ok.
>>
>> Federico, do you have a better wording suggestion for this rule?
>>
>> Jan, any further requests here? What would you like to see as next step?
> 
> A more concise wording proposal would probably help.

What do you think about:

diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
index 1e134ccebc..a975b9a85f 100644
--- a/docs/misra/rules.rst
+++ b/docs/misra/rules.rst
@@ -181,6 +181,13 @@ maintainers if you want to suggest a change.
         headers (xen/include/public/) are allowed to retain longer
         identifiers for backward compatibility.

+   * - `Rule 5.5 
<https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
+     - Required
+     - Identifiers shall be distinct from macro names
+     - Macros expanding to their own name are allowed (e.g., #define x x).
+       Clashes between names of function-like macros and identifiers of
+       non-callable entities are allowed.
+
     * - `Rule 5.6 
<https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_06.c>`_
       - Required
       - A typedef name shall be a unique identifier
Jan Beulich March 4, 2024, 2:17 p.m. UTC | #8
On 04.03.2024 14:31, Federico Serafini wrote:
> On 01/03/24 09:06, Jan Beulich wrote:
>> On 01.03.2024 00:28, Stefano Stabellini wrote:
>>> On Wed, 14 Feb 2024, Federico Serafini wrote:
>>>> On 14/02/24 14:15, Jan Beulich wrote:
>>>>> On 14.02.2024 12:27, Federico Serafini wrote:
>>>>>> On 14/02/24 09:28, Jan Beulich wrote:
>>>>>>> On 13.02.2024 23:33, Stefano Stabellini wrote:
>>>>>>>> Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
>>>>>>>> ---
>>>>>>>>     docs/misra/rules.rst | 6 ++++++
>>>>>>>>     1 file changed, 6 insertions(+)
>>>>>>>>
>>>>>>>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
>>>>>>>> index c185366966..931158b354 100644
>>>>>>>> --- a/docs/misra/rules.rst
>>>>>>>> +++ b/docs/misra/rules.rst
>>>>>>>> @@ -181,6 +181,12 @@ maintainers if you want to suggest a change.
>>>>>>>>            headers (xen/include/public/) are allowed to retain longer
>>>>>>>>            identifiers for backward compatibility.
>>>>>>>>     +   * - `Rule 5.5
>>>>>>>> <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
>>>>>>>> +     - Required
>>>>>>>> +     - Identifiers shall be distinct from macro names
>>>>>>>> +     - Clashes between function-like macros and non-callable entities
>>>>>>>> +       are allowed. The pattern #define x x is also allowed.
>>>>>>>
>>>>>>> Just for me to know what exactly is covered (hence also a question
>>>>>>> to Roberto as to [to be] implemented Eclair behavior): Even when
>>>>>>> the above would be sufficient (and imo better) people frequently
>>>>>>> write
>>>>>>>
>>>>>>> #define a(x, y) b(x, y)
>>>>>>>
>>>>>>> which, transformed to the specific case here, would then be
>>>>>>>
>>>>>>> #define a(x, y) a(x, y)
>>>>>>>
>>>>>>> I'd assume such ought to also be covered, but that's not clear
>>>>>>> from the spelling above.
>>>>>>
>>>>>> I list what happens in some different situations,
>>>>>> then we can find the right words for the documentation and/or
>>>>>> refine the configuration:
>>>>>>
>>>>>> If you
>>>>>> #define x x
>>>>>> and then use `x' as identifier,
>>>>>> the resulting violation is deviated (allowed pattern).
>>>>>>
>>>>>> If you
>>>>>> #define a(x, y) a(x, y)
>>>>>> and then use `a' as identifier for a non-callable entity,
>>>>>> the resulting violation is deviated (no clash with non-callable
>>>>>> entities).
>>>>>> If you use identifier `a' for a callable entity, the resulting violation
>>>>>> is reported: the allowed pattern covers only macros expanding to their
>>>>>> own name, in this case the macro name is considered to be
>>>>>> `a' only, not a(x, y).
>>>>>>
>>>>>> If you
>>>>>> #define a(x, y) b(x, y)
>>>>>> and then use `a' as identifier for a non-callable entity,
>>>>>> the resulting violation is deviated (no clash with non-callable
>>>>>> entities).
>>>>>
>>>>> I'm afraid I don't see what violation there is in this case, to
>>>>> deviate. As a result I'm also not sure I correctly understand the
>>>>> rest of your reply.
>>>>
>>>> #define a(x, y) b(x, y)
>>>>
>>>> int a; // Violation of Rule 5.5.
>>>>
>>>> The macro name `a' that exist before the preprocessing phase,
>>>> still exists after the preprocessing phase as identifier for the integer
>>>> variable and this is a violation.
>>>>
>>>>>> If you use `a' as identifier for a callable entity,
>>>>>> this is not a violation because after the preprocessing phase,
>>>>>> identifier `a' no longer exists.
>>>> I correct myself:
>>>> if you use `a' as identifier for a *function*,
>>>> it is not a violation because after the preprocessing phase
>>>> the identifier `a' no longer exists, for example:
>>>>
>>>> #define a(x, y) b(x, y)
>>>>
>>>> void a(int x, int y); // Ok.
>>>
>>> Federico, do you have a better wording suggestion for this rule?
>>>
>>> Jan, any further requests here? What would you like to see as next step?
>>
>> A more concise wording proposal would probably help.
> 
> What do you think about:
> 
> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
> index 1e134ccebc..a975b9a85f 100644
> --- a/docs/misra/rules.rst
> +++ b/docs/misra/rules.rst
> @@ -181,6 +181,13 @@ maintainers if you want to suggest a change.
>          headers (xen/include/public/) are allowed to retain longer
>          identifiers for backward compatibility.
> 
> +   * - `Rule 5.5 
> <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
> +     - Required
> +     - Identifiers shall be distinct from macro names
> +     - Macros expanding to their own name are allowed (e.g., #define x x).
> +       Clashes between names of function-like macros and identifiers of
> +       non-callable entities are allowed.

Imo that still leaves open e.g. the

#define a(x, y) a(x, y)

case: Permitted ("own name") or not permitted ("a" pretty clearly is expected
to be a callable entity here, besides being a function-like macro)?

Jan
Federico Serafini March 4, 2024, 3:39 p.m. UTC | #9
On 04/03/24 15:17, Jan Beulich wrote:
> On 04.03.2024 14:31, Federico Serafini wrote:
>> On 01/03/24 09:06, Jan Beulich wrote:
>>> On 01.03.2024 00:28, Stefano Stabellini wrote:
>>>> On Wed, 14 Feb 2024, Federico Serafini wrote:
>>>>> On 14/02/24 14:15, Jan Beulich wrote:
>>>>>> On 14.02.2024 12:27, Federico Serafini wrote:
>>>>>>> On 14/02/24 09:28, Jan Beulich wrote:
>>>>>>>> On 13.02.2024 23:33, Stefano Stabellini wrote:
>>>>>>>>> Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
>>>>>>>>> ---
>>>>>>>>>      docs/misra/rules.rst | 6 ++++++
>>>>>>>>>      1 file changed, 6 insertions(+)
>>>>>>>>>
>>>>>>>>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
>>>>>>>>> index c185366966..931158b354 100644
>>>>>>>>> --- a/docs/misra/rules.rst
>>>>>>>>> +++ b/docs/misra/rules.rst
>>>>>>>>> @@ -181,6 +181,12 @@ maintainers if you want to suggest a change.
>>>>>>>>>             headers (xen/include/public/) are allowed to retain longer
>>>>>>>>>             identifiers for backward compatibility.
>>>>>>>>>      +   * - `Rule 5.5
>>>>>>>>> <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
>>>>>>>>> +     - Required
>>>>>>>>> +     - Identifiers shall be distinct from macro names
>>>>>>>>> +     - Clashes between function-like macros and non-callable entities
>>>>>>>>> +       are allowed. The pattern #define x x is also allowed.
>>>>>>>>
>>>>>>>> Just for me to know what exactly is covered (hence also a question
>>>>>>>> to Roberto as to [to be] implemented Eclair behavior): Even when
>>>>>>>> the above would be sufficient (and imo better) people frequently
>>>>>>>> write
>>>>>>>>
>>>>>>>> #define a(x, y) b(x, y)
>>>>>>>>
>>>>>>>> which, transformed to the specific case here, would then be
>>>>>>>>
>>>>>>>> #define a(x, y) a(x, y)
>>>>>>>>
>>>>>>>> I'd assume such ought to also be covered, but that's not clear
>>>>>>>> from the spelling above.
>>>>>>>
>>>>>>> I list what happens in some different situations,
>>>>>>> then we can find the right words for the documentation and/or
>>>>>>> refine the configuration:
>>>>>>>
>>>>>>> If you
>>>>>>> #define x x
>>>>>>> and then use `x' as identifier,
>>>>>>> the resulting violation is deviated (allowed pattern).
>>>>>>>
>>>>>>> If you
>>>>>>> #define a(x, y) a(x, y)
>>>>>>> and then use `a' as identifier for a non-callable entity,
>>>>>>> the resulting violation is deviated (no clash with non-callable
>>>>>>> entities).
>>>>>>> If you use identifier `a' for a callable entity, the resulting violation
>>>>>>> is reported: the allowed pattern covers only macros expanding to their
>>>>>>> own name, in this case the macro name is considered to be
>>>>>>> `a' only, not a(x, y).
>>>>>>>
>>>>>>> If you
>>>>>>> #define a(x, y) b(x, y)
>>>>>>> and then use `a' as identifier for a non-callable entity,
>>>>>>> the resulting violation is deviated (no clash with non-callable
>>>>>>> entities).
>>>>>>
>>>>>> I'm afraid I don't see what violation there is in this case, to
>>>>>> deviate. As a result I'm also not sure I correctly understand the
>>>>>> rest of your reply.
>>>>>
>>>>> #define a(x, y) b(x, y)
>>>>>
>>>>> int a; // Violation of Rule 5.5.
>>>>>
>>>>> The macro name `a' that exist before the preprocessing phase,
>>>>> still exists after the preprocessing phase as identifier for the integer
>>>>> variable and this is a violation.
>>>>>
>>>>>>> If you use `a' as identifier for a callable entity,
>>>>>>> this is not a violation because after the preprocessing phase,
>>>>>>> identifier `a' no longer exists.
>>>>> I correct myself:
>>>>> if you use `a' as identifier for a *function*,
>>>>> it is not a violation because after the preprocessing phase
>>>>> the identifier `a' no longer exists, for example:
>>>>>
>>>>> #define a(x, y) b(x, y)
>>>>>
>>>>> void a(int x, int y); // Ok.
>>>>
>>>> Federico, do you have a better wording suggestion for this rule?
>>>>
>>>> Jan, any further requests here? What would you like to see as next step?
>>>
>>> A more concise wording proposal would probably help.
>>
>> What do you think about:
>>
>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
>> index 1e134ccebc..a975b9a85f 100644
>> --- a/docs/misra/rules.rst
>> +++ b/docs/misra/rules.rst
>> @@ -181,6 +181,13 @@ maintainers if you want to suggest a change.
>>           headers (xen/include/public/) are allowed to retain longer
>>           identifiers for backward compatibility.
>>
>> +   * - `Rule 5.5
>> <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
>> +     - Required
>> +     - Identifiers shall be distinct from macro names
>> +     - Macros expanding to their own name are allowed (e.g., #define x x).
>> +       Clashes between names of function-like macros and identifiers of
>> +       non-callable entities are allowed.
> 
> Imo that still leaves open e.g. the
> 
> #define a(x, y) a(x, y)
> 
> case: Permitted ("own name") or not permitted ("a" pretty clearly is expected
> to be a callable entity here, besides being a function-like macro)?

I would not consider your example as a macro that expands to its own
name, the macro name is considered to be `a' only.

Rather, you example can be used to trigger the "callable-noncallable"
part of the deviation, for example:

#define a(x, y) a(x, y)

void a(int x, int y); /* Not permitted (callable entity 'a'). */

void foo(int a);      /* Permitted (non-callable entity `a'). */
Jan Beulich March 4, 2024, 4:36 p.m. UTC | #10
On 04.03.2024 16:39, Federico Serafini wrote:
> On 04/03/24 15:17, Jan Beulich wrote:
>> On 04.03.2024 14:31, Federico Serafini wrote:
>>> On 01/03/24 09:06, Jan Beulich wrote:
>>>> On 01.03.2024 00:28, Stefano Stabellini wrote:
>>>>> On Wed, 14 Feb 2024, Federico Serafini wrote:
>>>>>> On 14/02/24 14:15, Jan Beulich wrote:
>>>>>>> On 14.02.2024 12:27, Federico Serafini wrote:
>>>>>>>> On 14/02/24 09:28, Jan Beulich wrote:
>>>>>>>>> On 13.02.2024 23:33, Stefano Stabellini wrote:
>>>>>>>>>> Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
>>>>>>>>>> ---
>>>>>>>>>>      docs/misra/rules.rst | 6 ++++++
>>>>>>>>>>      1 file changed, 6 insertions(+)
>>>>>>>>>>
>>>>>>>>>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
>>>>>>>>>> index c185366966..931158b354 100644
>>>>>>>>>> --- a/docs/misra/rules.rst
>>>>>>>>>> +++ b/docs/misra/rules.rst
>>>>>>>>>> @@ -181,6 +181,12 @@ maintainers if you want to suggest a change.
>>>>>>>>>>             headers (xen/include/public/) are allowed to retain longer
>>>>>>>>>>             identifiers for backward compatibility.
>>>>>>>>>>      +   * - `Rule 5.5
>>>>>>>>>> <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
>>>>>>>>>> +     - Required
>>>>>>>>>> +     - Identifiers shall be distinct from macro names
>>>>>>>>>> +     - Clashes between function-like macros and non-callable entities
>>>>>>>>>> +       are allowed. The pattern #define x x is also allowed.
>>>>>>>>>
>>>>>>>>> Just for me to know what exactly is covered (hence also a question
>>>>>>>>> to Roberto as to [to be] implemented Eclair behavior): Even when
>>>>>>>>> the above would be sufficient (and imo better) people frequently
>>>>>>>>> write
>>>>>>>>>
>>>>>>>>> #define a(x, y) b(x, y)
>>>>>>>>>
>>>>>>>>> which, transformed to the specific case here, would then be
>>>>>>>>>
>>>>>>>>> #define a(x, y) a(x, y)
>>>>>>>>>
>>>>>>>>> I'd assume such ought to also be covered, but that's not clear
>>>>>>>>> from the spelling above.
>>>>>>>>
>>>>>>>> I list what happens in some different situations,
>>>>>>>> then we can find the right words for the documentation and/or
>>>>>>>> refine the configuration:
>>>>>>>>
>>>>>>>> If you
>>>>>>>> #define x x
>>>>>>>> and then use `x' as identifier,
>>>>>>>> the resulting violation is deviated (allowed pattern).
>>>>>>>>
>>>>>>>> If you
>>>>>>>> #define a(x, y) a(x, y)
>>>>>>>> and then use `a' as identifier for a non-callable entity,
>>>>>>>> the resulting violation is deviated (no clash with non-callable
>>>>>>>> entities).
>>>>>>>> If you use identifier `a' for a callable entity, the resulting violation
>>>>>>>> is reported: the allowed pattern covers only macros expanding to their
>>>>>>>> own name, in this case the macro name is considered to be
>>>>>>>> `a' only, not a(x, y).
>>>>>>>>
>>>>>>>> If you
>>>>>>>> #define a(x, y) b(x, y)
>>>>>>>> and then use `a' as identifier for a non-callable entity,
>>>>>>>> the resulting violation is deviated (no clash with non-callable
>>>>>>>> entities).
>>>>>>>
>>>>>>> I'm afraid I don't see what violation there is in this case, to
>>>>>>> deviate. As a result I'm also not sure I correctly understand the
>>>>>>> rest of your reply.
>>>>>>
>>>>>> #define a(x, y) b(x, y)
>>>>>>
>>>>>> int a; // Violation of Rule 5.5.
>>>>>>
>>>>>> The macro name `a' that exist before the preprocessing phase,
>>>>>> still exists after the preprocessing phase as identifier for the integer
>>>>>> variable and this is a violation.
>>>>>>
>>>>>>>> If you use `a' as identifier for a callable entity,
>>>>>>>> this is not a violation because after the preprocessing phase,
>>>>>>>> identifier `a' no longer exists.
>>>>>> I correct myself:
>>>>>> if you use `a' as identifier for a *function*,
>>>>>> it is not a violation because after the preprocessing phase
>>>>>> the identifier `a' no longer exists, for example:
>>>>>>
>>>>>> #define a(x, y) b(x, y)
>>>>>>
>>>>>> void a(int x, int y); // Ok.
>>>>>
>>>>> Federico, do you have a better wording suggestion for this rule?
>>>>>
>>>>> Jan, any further requests here? What would you like to see as next step?
>>>>
>>>> A more concise wording proposal would probably help.
>>>
>>> What do you think about:
>>>
>>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
>>> index 1e134ccebc..a975b9a85f 100644
>>> --- a/docs/misra/rules.rst
>>> +++ b/docs/misra/rules.rst
>>> @@ -181,6 +181,13 @@ maintainers if you want to suggest a change.
>>>           headers (xen/include/public/) are allowed to retain longer
>>>           identifiers for backward compatibility.
>>>
>>> +   * - `Rule 5.5
>>> <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
>>> +     - Required
>>> +     - Identifiers shall be distinct from macro names
>>> +     - Macros expanding to their own name are allowed (e.g., #define x x).
>>> +       Clashes between names of function-like macros and identifiers of
>>> +       non-callable entities are allowed.
>>
>> Imo that still leaves open e.g. the
>>
>> #define a(x, y) a(x, y)
>>
>> case: Permitted ("own name") or not permitted ("a" pretty clearly is expected
>> to be a callable entity here, besides being a function-like macro)?
> 
> I would not consider your example as a macro that expands to its own
> name, the macro name is considered to be `a' only.

That's what I was assuming, and hence my asking back. I think the
above ought to be permitted just like "#define x x", and hence the
suggested text would need expanding, to ...

> Rather, you example can be used to trigger the "callable-noncallable"
> part of the deviation, for example:
> 
> #define a(x, y) a(x, y)
> 
> void a(int x, int y); /* Not permitted (callable entity 'a'). */

... prevent this ("not permitted") from happening. I'm pretty sure
you've already found instances of this pattern in our code base.

Jan

> void foo(int a);      /* Permitted (non-callable entity `a'). */
>
Stefano Stabellini March 5, 2024, 1:49 a.m. UTC | #11
On Mon, 4 Mar 2024, Jan Beulich wrote:
> On 04.03.2024 16:39, Federico Serafini wrote:
> > On 04/03/24 15:17, Jan Beulich wrote:
> >> On 04.03.2024 14:31, Federico Serafini wrote:
> >>> On 01/03/24 09:06, Jan Beulich wrote:
> >>>> On 01.03.2024 00:28, Stefano Stabellini wrote:
> >>>>> On Wed, 14 Feb 2024, Federico Serafini wrote:
> >>>>>> On 14/02/24 14:15, Jan Beulich wrote:
> >>>>>>> On 14.02.2024 12:27, Federico Serafini wrote:
> >>>>>>>> On 14/02/24 09:28, Jan Beulich wrote:
> >>>>>>>>> On 13.02.2024 23:33, Stefano Stabellini wrote:
> >>>>>>>>>> Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
> >>>>>>>>>> ---
> >>>>>>>>>>      docs/misra/rules.rst | 6 ++++++
> >>>>>>>>>>      1 file changed, 6 insertions(+)
> >>>>>>>>>>
> >>>>>>>>>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
> >>>>>>>>>> index c185366966..931158b354 100644
> >>>>>>>>>> --- a/docs/misra/rules.rst
> >>>>>>>>>> +++ b/docs/misra/rules.rst
> >>>>>>>>>> @@ -181,6 +181,12 @@ maintainers if you want to suggest a change.
> >>>>>>>>>>             headers (xen/include/public/) are allowed to retain longer
> >>>>>>>>>>             identifiers for backward compatibility.
> >>>>>>>>>>      +   * - `Rule 5.5
> >>>>>>>>>> <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
> >>>>>>>>>> +     - Required
> >>>>>>>>>> +     - Identifiers shall be distinct from macro names
> >>>>>>>>>> +     - Clashes between function-like macros and non-callable entities
> >>>>>>>>>> +       are allowed. The pattern #define x x is also allowed.
> >>>>>>>>>
> >>>>>>>>> Just for me to know what exactly is covered (hence also a question
> >>>>>>>>> to Roberto as to [to be] implemented Eclair behavior): Even when
> >>>>>>>>> the above would be sufficient (and imo better) people frequently
> >>>>>>>>> write
> >>>>>>>>>
> >>>>>>>>> #define a(x, y) b(x, y)
> >>>>>>>>>
> >>>>>>>>> which, transformed to the specific case here, would then be
> >>>>>>>>>
> >>>>>>>>> #define a(x, y) a(x, y)
> >>>>>>>>>
> >>>>>>>>> I'd assume such ought to also be covered, but that's not clear
> >>>>>>>>> from the spelling above.
> >>>>>>>>
> >>>>>>>> I list what happens in some different situations,
> >>>>>>>> then we can find the right words for the documentation and/or
> >>>>>>>> refine the configuration:
> >>>>>>>>
> >>>>>>>> If you
> >>>>>>>> #define x x
> >>>>>>>> and then use `x' as identifier,
> >>>>>>>> the resulting violation is deviated (allowed pattern).
> >>>>>>>>
> >>>>>>>> If you
> >>>>>>>> #define a(x, y) a(x, y)
> >>>>>>>> and then use `a' as identifier for a non-callable entity,
> >>>>>>>> the resulting violation is deviated (no clash with non-callable
> >>>>>>>> entities).
> >>>>>>>> If you use identifier `a' for a callable entity, the resulting violation
> >>>>>>>> is reported: the allowed pattern covers only macros expanding to their
> >>>>>>>> own name, in this case the macro name is considered to be
> >>>>>>>> `a' only, not a(x, y).
> >>>>>>>>
> >>>>>>>> If you
> >>>>>>>> #define a(x, y) b(x, y)
> >>>>>>>> and then use `a' as identifier for a non-callable entity,
> >>>>>>>> the resulting violation is deviated (no clash with non-callable
> >>>>>>>> entities).
> >>>>>>>
> >>>>>>> I'm afraid I don't see what violation there is in this case, to
> >>>>>>> deviate. As a result I'm also not sure I correctly understand the
> >>>>>>> rest of your reply.
> >>>>>>
> >>>>>> #define a(x, y) b(x, y)
> >>>>>>
> >>>>>> int a; // Violation of Rule 5.5.
> >>>>>>
> >>>>>> The macro name `a' that exist before the preprocessing phase,
> >>>>>> still exists after the preprocessing phase as identifier for the integer
> >>>>>> variable and this is a violation.
> >>>>>>
> >>>>>>>> If you use `a' as identifier for a callable entity,
> >>>>>>>> this is not a violation because after the preprocessing phase,
> >>>>>>>> identifier `a' no longer exists.
> >>>>>> I correct myself:
> >>>>>> if you use `a' as identifier for a *function*,
> >>>>>> it is not a violation because after the preprocessing phase
> >>>>>> the identifier `a' no longer exists, for example:
> >>>>>>
> >>>>>> #define a(x, y) b(x, y)
> >>>>>>
> >>>>>> void a(int x, int y); // Ok.
> >>>>>
> >>>>> Federico, do you have a better wording suggestion for this rule?
> >>>>>
> >>>>> Jan, any further requests here? What would you like to see as next step?
> >>>>
> >>>> A more concise wording proposal would probably help.
> >>>
> >>> What do you think about:
> >>>
> >>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
> >>> index 1e134ccebc..a975b9a85f 100644
> >>> --- a/docs/misra/rules.rst
> >>> +++ b/docs/misra/rules.rst
> >>> @@ -181,6 +181,13 @@ maintainers if you want to suggest a change.
> >>>           headers (xen/include/public/) are allowed to retain longer
> >>>           identifiers for backward compatibility.
> >>>
> >>> +   * - `Rule 5.5
> >>> <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
> >>> +     - Required
> >>> +     - Identifiers shall be distinct from macro names
> >>> +     - Macros expanding to their own name are allowed (e.g., #define x x).
> >>> +       Clashes between names of function-like macros and identifiers of
> >>> +       non-callable entities are allowed.
> >>
> >> Imo that still leaves open e.g. the
> >>
> >> #define a(x, y) a(x, y)
> >>
> >> case: Permitted ("own name") or not permitted ("a" pretty clearly is expected
> >> to be a callable entity here, besides being a function-like macro)?
> > 
> > I would not consider your example as a macro that expands to its own
> > name, the macro name is considered to be `a' only.
> 
> That's what I was assuming, and hence my asking back. I think the
> above ought to be permitted just like "#define x x", and hence the
> suggested text would need expanding, to ...
> 
> > Rather, you example can be used to trigger the "callable-noncallable"
> > part of the deviation, for example:
> > 
> > #define a(x, y) a(x, y)
> > 
> > void a(int x, int y); /* Not permitted (callable entity 'a'). */
> 
> ... prevent this ("not permitted") from happening. I'm pretty sure
> you've already found instances of this pattern in our code base.

Sorry Jan, purely asking as a clarification because I couldn't
understand what you wrote.

You are asking for a clarification in the wording so that the following
is explicitly allowed, right?

#define a(x, y) a(x, y)
void a(int x, int y);
Jan Beulich March 5, 2024, 6:50 a.m. UTC | #12
On 05.03.2024 02:49, Stefano Stabellini wrote:
> On Mon, 4 Mar 2024, Jan Beulich wrote:
>> On 04.03.2024 16:39, Federico Serafini wrote:
>>> On 04/03/24 15:17, Jan Beulich wrote:
>>>> On 04.03.2024 14:31, Federico Serafini wrote:
>>>>> On 01/03/24 09:06, Jan Beulich wrote:
>>>>>> On 01.03.2024 00:28, Stefano Stabellini wrote:
>>>>>>> On Wed, 14 Feb 2024, Federico Serafini wrote:
>>>>>>>> On 14/02/24 14:15, Jan Beulich wrote:
>>>>>>>>> On 14.02.2024 12:27, Federico Serafini wrote:
>>>>>>>>>> On 14/02/24 09:28, Jan Beulich wrote:
>>>>>>>>>>> On 13.02.2024 23:33, Stefano Stabellini wrote:
>>>>>>>>>>>> Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
>>>>>>>>>>>> ---
>>>>>>>>>>>>      docs/misra/rules.rst | 6 ++++++
>>>>>>>>>>>>      1 file changed, 6 insertions(+)
>>>>>>>>>>>>
>>>>>>>>>>>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
>>>>>>>>>>>> index c185366966..931158b354 100644
>>>>>>>>>>>> --- a/docs/misra/rules.rst
>>>>>>>>>>>> +++ b/docs/misra/rules.rst
>>>>>>>>>>>> @@ -181,6 +181,12 @@ maintainers if you want to suggest a change.
>>>>>>>>>>>>             headers (xen/include/public/) are allowed to retain longer
>>>>>>>>>>>>             identifiers for backward compatibility.
>>>>>>>>>>>>      +   * - `Rule 5.5
>>>>>>>>>>>> <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
>>>>>>>>>>>> +     - Required
>>>>>>>>>>>> +     - Identifiers shall be distinct from macro names
>>>>>>>>>>>> +     - Clashes between function-like macros and non-callable entities
>>>>>>>>>>>> +       are allowed. The pattern #define x x is also allowed.
>>>>>>>>>>>
>>>>>>>>>>> Just for me to know what exactly is covered (hence also a question
>>>>>>>>>>> to Roberto as to [to be] implemented Eclair behavior): Even when
>>>>>>>>>>> the above would be sufficient (and imo better) people frequently
>>>>>>>>>>> write
>>>>>>>>>>>
>>>>>>>>>>> #define a(x, y) b(x, y)
>>>>>>>>>>>
>>>>>>>>>>> which, transformed to the specific case here, would then be
>>>>>>>>>>>
>>>>>>>>>>> #define a(x, y) a(x, y)
>>>>>>>>>>>
>>>>>>>>>>> I'd assume such ought to also be covered, but that's not clear
>>>>>>>>>>> from the spelling above.
>>>>>>>>>>
>>>>>>>>>> I list what happens in some different situations,
>>>>>>>>>> then we can find the right words for the documentation and/or
>>>>>>>>>> refine the configuration:
>>>>>>>>>>
>>>>>>>>>> If you
>>>>>>>>>> #define x x
>>>>>>>>>> and then use `x' as identifier,
>>>>>>>>>> the resulting violation is deviated (allowed pattern).
>>>>>>>>>>
>>>>>>>>>> If you
>>>>>>>>>> #define a(x, y) a(x, y)
>>>>>>>>>> and then use `a' as identifier for a non-callable entity,
>>>>>>>>>> the resulting violation is deviated (no clash with non-callable
>>>>>>>>>> entities).
>>>>>>>>>> If you use identifier `a' for a callable entity, the resulting violation
>>>>>>>>>> is reported: the allowed pattern covers only macros expanding to their
>>>>>>>>>> own name, in this case the macro name is considered to be
>>>>>>>>>> `a' only, not a(x, y).
>>>>>>>>>>
>>>>>>>>>> If you
>>>>>>>>>> #define a(x, y) b(x, y)
>>>>>>>>>> and then use `a' as identifier for a non-callable entity,
>>>>>>>>>> the resulting violation is deviated (no clash with non-callable
>>>>>>>>>> entities).
>>>>>>>>>
>>>>>>>>> I'm afraid I don't see what violation there is in this case, to
>>>>>>>>> deviate. As a result I'm also not sure I correctly understand the
>>>>>>>>> rest of your reply.
>>>>>>>>
>>>>>>>> #define a(x, y) b(x, y)
>>>>>>>>
>>>>>>>> int a; // Violation of Rule 5.5.
>>>>>>>>
>>>>>>>> The macro name `a' that exist before the preprocessing phase,
>>>>>>>> still exists after the preprocessing phase as identifier for the integer
>>>>>>>> variable and this is a violation.
>>>>>>>>
>>>>>>>>>> If you use `a' as identifier for a callable entity,
>>>>>>>>>> this is not a violation because after the preprocessing phase,
>>>>>>>>>> identifier `a' no longer exists.
>>>>>>>> I correct myself:
>>>>>>>> if you use `a' as identifier for a *function*,
>>>>>>>> it is not a violation because after the preprocessing phase
>>>>>>>> the identifier `a' no longer exists, for example:
>>>>>>>>
>>>>>>>> #define a(x, y) b(x, y)
>>>>>>>>
>>>>>>>> void a(int x, int y); // Ok.
>>>>>>>
>>>>>>> Federico, do you have a better wording suggestion for this rule?
>>>>>>>
>>>>>>> Jan, any further requests here? What would you like to see as next step?
>>>>>>
>>>>>> A more concise wording proposal would probably help.
>>>>>
>>>>> What do you think about:
>>>>>
>>>>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
>>>>> index 1e134ccebc..a975b9a85f 100644
>>>>> --- a/docs/misra/rules.rst
>>>>> +++ b/docs/misra/rules.rst
>>>>> @@ -181,6 +181,13 @@ maintainers if you want to suggest a change.
>>>>>           headers (xen/include/public/) are allowed to retain longer
>>>>>           identifiers for backward compatibility.
>>>>>
>>>>> +   * - `Rule 5.5
>>>>> <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
>>>>> +     - Required
>>>>> +     - Identifiers shall be distinct from macro names
>>>>> +     - Macros expanding to their own name are allowed (e.g., #define x x).
>>>>> +       Clashes between names of function-like macros and identifiers of
>>>>> +       non-callable entities are allowed.
>>>>
>>>> Imo that still leaves open e.g. the
>>>>
>>>> #define a(x, y) a(x, y)
>>>>
>>>> case: Permitted ("own name") or not permitted ("a" pretty clearly is expected
>>>> to be a callable entity here, besides being a function-like macro)?
>>>
>>> I would not consider your example as a macro that expands to its own
>>> name, the macro name is considered to be `a' only.
>>
>> That's what I was assuming, and hence my asking back. I think the
>> above ought to be permitted just like "#define x x", and hence the
>> suggested text would need expanding, to ...
>>
>>> Rather, you example can be used to trigger the "callable-noncallable"
>>> part of the deviation, for example:
>>>
>>> #define a(x, y) a(x, y)
>>>
>>> void a(int x, int y); /* Not permitted (callable entity 'a'). */
>>
>> ... prevent this ("not permitted") from happening. I'm pretty sure
>> you've already found instances of this pattern in our code base.
> 
> Sorry Jan, purely asking as a clarification because I couldn't
> understand what you wrote.
> 
> You are asking for a clarification in the wording so that the following
> is explicitly allowed, right?
> 
> #define a(x, y) a(x, y)
> void a(int x, int y);

Yes. (Or, less desirable, unambiguously disallowed.)

Jan
Jan Beulich March 5, 2024, 4:29 p.m. UTC | #13
On 04.03.2024 17:36, Jan Beulich wrote:
> On 04.03.2024 16:39, Federico Serafini wrote:
>> On 04/03/24 15:17, Jan Beulich wrote:
>>> On 04.03.2024 14:31, Federico Serafini wrote:
>>>> On 01/03/24 09:06, Jan Beulich wrote:
>>>>> On 01.03.2024 00:28, Stefano Stabellini wrote:
>>>>>> On Wed, 14 Feb 2024, Federico Serafini wrote:
>>>>>>> On 14/02/24 14:15, Jan Beulich wrote:
>>>>>>>> On 14.02.2024 12:27, Federico Serafini wrote:
>>>>>>>>> On 14/02/24 09:28, Jan Beulich wrote:
>>>>>>>>>> On 13.02.2024 23:33, Stefano Stabellini wrote:
>>>>>>>>>>> Signed-off-by: Stefano Stabellini <stefano.stabellini@amd.com>
>>>>>>>>>>> ---
>>>>>>>>>>>      docs/misra/rules.rst | 6 ++++++
>>>>>>>>>>>      1 file changed, 6 insertions(+)
>>>>>>>>>>>
>>>>>>>>>>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
>>>>>>>>>>> index c185366966..931158b354 100644
>>>>>>>>>>> --- a/docs/misra/rules.rst
>>>>>>>>>>> +++ b/docs/misra/rules.rst
>>>>>>>>>>> @@ -181,6 +181,12 @@ maintainers if you want to suggest a change.
>>>>>>>>>>>             headers (xen/include/public/) are allowed to retain longer
>>>>>>>>>>>             identifiers for backward compatibility.
>>>>>>>>>>>      +   * - `Rule 5.5
>>>>>>>>>>> <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
>>>>>>>>>>> +     - Required
>>>>>>>>>>> +     - Identifiers shall be distinct from macro names
>>>>>>>>>>> +     - Clashes between function-like macros and non-callable entities
>>>>>>>>>>> +       are allowed. The pattern #define x x is also allowed.
>>>>>>>>>>
>>>>>>>>>> Just for me to know what exactly is covered (hence also a question
>>>>>>>>>> to Roberto as to [to be] implemented Eclair behavior): Even when
>>>>>>>>>> the above would be sufficient (and imo better) people frequently
>>>>>>>>>> write
>>>>>>>>>>
>>>>>>>>>> #define a(x, y) b(x, y)
>>>>>>>>>>
>>>>>>>>>> which, transformed to the specific case here, would then be
>>>>>>>>>>
>>>>>>>>>> #define a(x, y) a(x, y)
>>>>>>>>>>
>>>>>>>>>> I'd assume such ought to also be covered, but that's not clear
>>>>>>>>>> from the spelling above.
>>>>>>>>>
>>>>>>>>> I list what happens in some different situations,
>>>>>>>>> then we can find the right words for the documentation and/or
>>>>>>>>> refine the configuration:
>>>>>>>>>
>>>>>>>>> If you
>>>>>>>>> #define x x
>>>>>>>>> and then use `x' as identifier,
>>>>>>>>> the resulting violation is deviated (allowed pattern).
>>>>>>>>>
>>>>>>>>> If you
>>>>>>>>> #define a(x, y) a(x, y)
>>>>>>>>> and then use `a' as identifier for a non-callable entity,
>>>>>>>>> the resulting violation is deviated (no clash with non-callable
>>>>>>>>> entities).
>>>>>>>>> If you use identifier `a' for a callable entity, the resulting violation
>>>>>>>>> is reported: the allowed pattern covers only macros expanding to their
>>>>>>>>> own name, in this case the macro name is considered to be
>>>>>>>>> `a' only, not a(x, y).
>>>>>>>>>
>>>>>>>>> If you
>>>>>>>>> #define a(x, y) b(x, y)
>>>>>>>>> and then use `a' as identifier for a non-callable entity,
>>>>>>>>> the resulting violation is deviated (no clash with non-callable
>>>>>>>>> entities).
>>>>>>>>
>>>>>>>> I'm afraid I don't see what violation there is in this case, to
>>>>>>>> deviate. As a result I'm also not sure I correctly understand the
>>>>>>>> rest of your reply.
>>>>>>>
>>>>>>> #define a(x, y) b(x, y)
>>>>>>>
>>>>>>> int a; // Violation of Rule 5.5.
>>>>>>>
>>>>>>> The macro name `a' that exist before the preprocessing phase,
>>>>>>> still exists after the preprocessing phase as identifier for the integer
>>>>>>> variable and this is a violation.
>>>>>>>
>>>>>>>>> If you use `a' as identifier for a callable entity,
>>>>>>>>> this is not a violation because after the preprocessing phase,
>>>>>>>>> identifier `a' no longer exists.
>>>>>>> I correct myself:
>>>>>>> if you use `a' as identifier for a *function*,
>>>>>>> it is not a violation because after the preprocessing phase
>>>>>>> the identifier `a' no longer exists, for example:
>>>>>>>
>>>>>>> #define a(x, y) b(x, y)
>>>>>>>
>>>>>>> void a(int x, int y); // Ok.
>>>>>>
>>>>>> Federico, do you have a better wording suggestion for this rule?
>>>>>>
>>>>>> Jan, any further requests here? What would you like to see as next step?
>>>>>
>>>>> A more concise wording proposal would probably help.
>>>>
>>>> What do you think about:
>>>>
>>>> diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
>>>> index 1e134ccebc..a975b9a85f 100644
>>>> --- a/docs/misra/rules.rst
>>>> +++ b/docs/misra/rules.rst
>>>> @@ -181,6 +181,13 @@ maintainers if you want to suggest a change.
>>>>           headers (xen/include/public/) are allowed to retain longer
>>>>           identifiers for backward compatibility.
>>>>
>>>> +   * - `Rule 5.5
>>>> <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
>>>> +     - Required
>>>> +     - Identifiers shall be distinct from macro names
>>>> +     - Macros expanding to their own name are allowed (e.g., #define x x).
>>>> +       Clashes between names of function-like macros and identifiers of
>>>> +       non-callable entities are allowed.
>>>
>>> Imo that still leaves open e.g. the
>>>
>>> #define a(x, y) a(x, y)
>>>
>>> case: Permitted ("own name") or not permitted ("a" pretty clearly is expected
>>> to be a callable entity here, besides being a function-like macro)?
>>
>> I would not consider your example as a macro that expands to its own
>> name, the macro name is considered to be `a' only.
> 
> That's what I was assuming, and hence my asking back. I think the
> above ought to be permitted just like "#define x x", and hence the
> suggested text would need expanding, to ...
> 
>> Rather, you example can be used to trigger the "callable-noncallable"
>> part of the deviation, for example:
>>
>> #define a(x, y) a(x, y)
>>
>> void a(int x, int y); /* Not permitted (callable entity 'a'). */
> 
> ... prevent this ("not permitted") from happening. I'm pretty sure
> you've already found instances of this pattern in our code base.

And btw, see https://lists.xen.org/archives/html/xen-devel/2024-03/msg00159.html
for yet another slightly different pattern that I'd rather not see becoming
"forbidden".

Jan
diff mbox series

Patch

diff --git a/docs/misra/rules.rst b/docs/misra/rules.rst
index c185366966..931158b354 100644
--- a/docs/misra/rules.rst
+++ b/docs/misra/rules.rst
@@ -181,6 +181,12 @@  maintainers if you want to suggest a change.
        headers (xen/include/public/) are allowed to retain longer
        identifiers for backward compatibility.
 
+   * - `Rule 5.5 <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_05.c>`_
+     - Required
+     - Identifiers shall be distinct from macro names
+     - Clashes between function-like macros and non-callable entities
+       are allowed. The pattern #define x x is also allowed.
+
    * - `Rule 5.6 <https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite/-/blob/master/R_05_06.c>`_
      - Required
      - A typedef name shall be a unique identifier