[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 2/3] docs/misra/rules.rst: add rule 5.5
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@xxxxxxx> > >>>>>>>>>> --- > >>>>>>>>>> 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);
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |