diff mbox series

docs: Explain the desired position of function attributes

Message ID 20210924202302.2335542-1-keescook@chromium.org (mailing list archive)
State Superseded
Headers show
Series docs: Explain the desired position of function attributes | expand

Commit Message

Kees Cook Sept. 24, 2021, 8:23 p.m. UTC
While discussing how to format the addition of various function
attributes, some "unwritten rules" of ordering surfaced[1]. Capture a
synthesized version of Linus's, Joe's, and Rasmus's recommendations on
this subject for future reference.

[1] https://lore.kernel.org/mm-commits/CAHk-=wiOCLRny5aifWNhr621kYrJwhfURsa0vFPeUEm8mF0ufg@mail.gmail.com

Signed-off-by: Kees Cook <keescook@chromium.org>
---
 Documentation/process/coding-style.rst | 27 ++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

Comments

Randy Dunlap Sept. 24, 2021, 8:27 p.m. UTC | #1
On 9/24/21 1:23 PM, Kees Cook wrote:
> While discussing how to format the addition of various function
> attributes, some "unwritten rules" of ordering surfaced[1]. Capture a
> synthesized version of Linus's, Joe's, and Rasmus's recommendations on
> this subject for future reference.
> 
> [1] https://lore.kernel.org/mm-commits/CAHk-=wiOCLRny5aifWNhr621kYrJwhfURsa0vFPeUEm8mF0ufg@mail.gmail.com
> 
> Signed-off-by: Kees Cook <keescook@chromium.org>
> ---
>   Documentation/process/coding-style.rst | 27 ++++++++++++++++++++++++++
>   1 file changed, 27 insertions(+)
> 
> diff --git a/Documentation/process/coding-style.rst b/Documentation/process/coding-style.rst
> index 42969ab37b34..3559c34a9281 100644
> --- a/Documentation/process/coding-style.rst
> +++ b/Documentation/process/coding-style.rst
> @@ -487,6 +487,33 @@ because it is a simple way to add valuable information for the reader.
>   Do not use the ``extern`` keyword with function prototypes as this makes
>   lines longer and isn't strictly necessary.
>   
> +When writing a function prototype, please keep the `order of elements regular
> +<https://lore.kernel.org/mm-commits/CAHk-=wiOCLRny5aifWNhr621kYrJwhfURsa0vFPeUEm8mF0ufg@mail.gmail.com>`_. For example::
> +
> +	__must_check __printf(4, 5) __malloc __init
> +	static __always_inline void *action(enum magic value, size_t size,
> +					    u8 count, char *fmt, ...)
> +	{
> +		...
> +	}
> +
> +The preferred order of elements for a function prototype is:
> +
> +- attributes on the preceding lines
> +

I thought that idea was already nacked: (it's more of a BSD thing AFAIK)
(and I would NAK it if I could :)

"""
> Attributes should be on their own line, they can be quite lengthy.

No, no no. They really shouldn't.
""

from: https://lore.kernel.org/mm-commits/CAHk-=wjS-Jg7sGMwUPpDsjv392nDOOs0CtUtVkp=S6Q7JzFJRw@mail.gmail.com/

> +  - return type attributes (here, ``__must_check``)
> +  - function parameter attributes (here, ``__printf(4,5)``)
> +  - function behavior attributes (here, ``__malloc``)
> +  - storage class attributes (here, ``__init``)
> +
> +- main function prototype on the next lines
> +
> +  - storage class (here, ``static __always_inline`` -- even though
> +    ``__always_inline`` is technically an attribute, it is treated like
> +    ``inline``)
> +  - return type (here, ``void *``)
> +  - function name (here, ``action``)
> +  - function parameters (as described earlier: each with type and name)
>   
>   7) Centralized exiting of functions
>   -----------------------------------
>
Kees Cook Sept. 24, 2021, 9:46 p.m. UTC | #2
On Fri, Sep 24, 2021 at 01:27:20PM -0700, Randy Dunlap wrote:
> On 9/24/21 1:23 PM, Kees Cook wrote:
> > +The preferred order of elements for a function prototype is:
> > +
> > +- attributes on the preceding lines
> > +
> 
> I thought that idea was already nacked: (it's more of a BSD thing AFAIK)
> (and I would NAK it if I could :)
> 
> """
> > Attributes should be on their own line, they can be quite lengthy.
> 
> No, no no. They really shouldn't.
> ""
> 
> from: https://lore.kernel.org/mm-commits/CAHk-=wjS-Jg7sGMwUPpDsjv392nDOOs0CtUtVkp=S6Q7JzFJRw@mail.gmail.com/

Right -- and then Joe and Rasmus had some convincing counter-arguments,
IMO. So, given the outlined Docs patch, I'd like to see what folks can
propose in the form of alternative patches for this topic.

I genuinely don't care. I just want to have something I can follow for the
refactoring of the allocator attributes. :) The trouble I had with Linus's
suggestion is that some attributes don't work[1] at the end for function
definitions, so I'm left unable to follow his recommendations too.

-Kees

[1] https://lore.kernel.org/mm-commits/202109211630.2D00627@keescook/
diff mbox series

Patch

diff --git a/Documentation/process/coding-style.rst b/Documentation/process/coding-style.rst
index 42969ab37b34..3559c34a9281 100644
--- a/Documentation/process/coding-style.rst
+++ b/Documentation/process/coding-style.rst
@@ -487,6 +487,33 @@  because it is a simple way to add valuable information for the reader.
 Do not use the ``extern`` keyword with function prototypes as this makes
 lines longer and isn't strictly necessary.
 
+When writing a function prototype, please keep the `order of elements regular
+<https://lore.kernel.org/mm-commits/CAHk-=wiOCLRny5aifWNhr621kYrJwhfURsa0vFPeUEm8mF0ufg@mail.gmail.com>`_. For example::
+
+	__must_check __printf(4, 5) __malloc __init
+	static __always_inline void *action(enum magic value, size_t size,
+					    u8 count, char *fmt, ...)
+	{
+		...
+	}
+
+The preferred order of elements for a function prototype is:
+
+- attributes on the preceding lines
+
+  - return type attributes (here, ``__must_check``)
+  - function parameter attributes (here, ``__printf(4,5)``)
+  - function behavior attributes (here, ``__malloc``)
+  - storage class attributes (here, ``__init``)
+
+- main function prototype on the next lines
+
+  - storage class (here, ``static __always_inline`` -- even though
+    ``__always_inline`` is technically an attribute, it is treated like
+    ``inline``)
+  - return type (here, ``void *``)
+  - function name (here, ``action``)
+  - function parameters (as described earlier: each with type and name)
 
 7) Centralized exiting of functions
 -----------------------------------