Linux kernel coding style 1

 


 


 Linux kernel coding style

            This  is  a  short  document describing the preferred coding
            style for the linux kernel.  Coding style is very  personal,
            and  I  won't  _force_ my views on anybody, but this is what
            goes for anything that I have to be able  to  maintain,  and
            I'd  prefer  it  for most other things too.  Please at least
            consider the points made here.

            First off, I'd suggest printing out a copy of the GNU coding
            standards,  and  NOT  read it.  Burn them, it's a great sym-
            bolic gesture.

            Anyway, here goes:


 Chapter 1: Indentation

            Tabs are 8 characters, and  thus  indentations  are  also  8
            characters.   There  are  heretic movements that try to make
            indentations 4 (or even 2!)  characters deep,  and  that  is
            akin to trying to define the value of PI to be 3.

            Rationale:  The  whole idea behind indentation is to clearly
            define where a block of control starts and ends.  Especially
            when  you've  been  looking  at  your screen for 20 straight
            hours, you'll find it a lot easier to see how  the  indenta-
            tion works if you have large indentations.

            Now, some people will claim that having 8-character indenta-
            tions makes the code move too far to the right, and makes it
            hard  to read on a 80-character terminal screen.  The answer
            to that is that if you need more than 3 levels  of  indenta-
            tion, you're screwed anyway, and should fix your program.

            In  short,  8-char  indents  make things easier to read, and
            have the added benefit of warning you  when  you're  nesting
            your functions too deep.  Heed that warning.

            Don't  put  multiple  statements on a single line unless you
            have something to hide:

                 if (condition) do_this;
                    do_something_everytime;

            Outside of comments, documentation and  except  in  Kconfig,
            spaces are never used for indentation, and the above example
            is deliberately broken.

            Get a decent editor and don't leave whitespace at the end of
            lines.


 Chapter 2: Breaking long lines and strings

            Coding  style  is  all about readability and maintainability
            using commonly available tools.

            The limit on the length of lines is 80 columns and this is a
            hard limit.

            Statements longer than 80 columns will be broken into sensi-
            ble chunks.  Descendants are  always  substantially  shorter
            than  the  parent and are placed substantially to the right.
            The same applies to function headers with  a  long  argument
            list.  Long strings are as well broken into shorter strings.


                 void fun(int a, int b, int c)
                 {
                    if (condition)
                       printk( KERN_WARNING
                         "Warning this is a long printk with "
                         "3 parameters a: %u b: %u c: %u 0, a, b, c);
                    else
                       next_statement;
                 }


 Chapter 3: Placing Braces

            The other issue that always comes up in  C  styling  is  the
            placement  of braces.  Unlike the indent size, there are few
            technical reasons to choose one placement strategy over  the
            other, but the preferred way, as shown to us by the prophets
            Kernighan and Ritchie, is to put the opening brace  last  on
            the line, and put the closing brace first, thusly:

                 if (x is true) {
                     we do y
                 }


            However,  there  is one special case, namely functions: they
            have the opening brace at the beginning of  the  next  line,
            thus:

                 int function(int x)
                 {
                     body of function
                 }


            Heretic  people  all  over  the world have claimed that this
            inconsistency is ...  well ...  inconsistent, but all right-
            thinking  people  know  that (a) K&R are _right_ and (b) K&R
            are right.  Besides, functions are special anyway (you can't
            nest them in C).

            Note  that  the closing brace is empty on a line of its own,
            _except_ in the cases where it is followed by a continuation
            of  the same statement, ie a "while" in a do-statement or an
            "else" in an if-statement, like this:

                 do {
                      body of do-loop
                 } while (condition);

            and

                 if (x == y) {
                      ..
                 } else if (x > y) {
                      ...
                 } else {
                      ....
                 }


            Rationale: K&R.

            Also, note that this brace-placement also minimizes the num-
            ber  of  empty  (or almost empty) lines, without any loss of
            readability.  Thus, as  the  supply  of  new-lines  on  your
            screen  is  not a renewable resource (think 25-line terminal
            screens here), you have more empty lines to put comments on.


 Chapter 4: Naming

            C  is  a  Spartan  language,  and  so should your naming be.
            Unlike Modula-2 and Pascal programmers, C programmers do not
            use  cute  names  like ThisVariableIsATemporaryCounter.  A C
            programmer would call that variable  "tmp",  which  is  much
            easier  to write, and not the least more difficult to under-
            stand.

            HOWEVER, while mixed-case names are frowned  upon,  descrip-
            tive  names  for  global  variables  are  a must.  To call a
            global function "foo" is a shooting offense.

            GLOBAL variables (to be used only if you _really_ need them)
            need  to have descriptive names, as do global functions.  If
            you have a function that counts the number of active  users,
            you  should call that "count_active_users()" or similar, you
            should _not_ call it "cntusr()".

            Encoding the type of a function  into  the  name  (so-called
            Hungarian  notation)  is  brain damaged - the compiler knows
            the types anyway and can check those, and it  only  confuses
            the programmer.  No wonder MicroSoft makes buggy programs.

            LOCAL  variable names should be short, and to the point.  If
            you have some random integer loop counter, it should  proba-
            bly be called "i".  Calling it "loop_counter" is non-produc-
            tive, if there is no  chance  of  it  being  mis-understood.
            Similarly, "tmp" can be just about any type of variable that
            is used to hold a temporary value.

            If you are afraid to mix up your local variable  names,  you
            have  another  problem, which is called the function-growth-
            hormone-imbalance syndrome.  See next chapter.


 Chapter 5: Functions

            Functions should be short and sweet, and do just one  thing.
            They  should  fit  on  one  or  two  screenfuls of text (the
            ISO/ANSI screen size is 80x24, as we all know), and  do  one
            thing and do that well.

            The  maximum  length of a function is inversely proportional
            to the complexity and indentation level  of  that  function.
            So,  if you have a conceptually simple function that is just
            one long (but simple) case-statement, where you have  to  do
            lots  of  small things for a lot of different cases, it's OK
            to have a longer function.

            However, if you have a complex  function,  and  you  suspect
            that a less-than-gifted first-year high-school student might
            not even understand what the  function  is  all  about,  you
            should  adhere  to  the maximum limits all the more closely.
            Use helper functions with descriptive names (you can ask the
            compiler to in-line them if you think it's performance-crit-
            ical, and it will probably do a better job of  it  than  you
            would have done).

            Another measure of the function is the number of local vari-
            ables.  They shouldn't exceed 5-10, or  you're  doing  some-
            thing  wrong.   Re-think  the  function,  and  split it into
            smaller pieces.  A human brain  can  generally  easily  keep
            track of about 7 different things, anything more and it gets
            confused.  You know you're brilliant, but maybe  you'd  like
            to understand what you did 2 weeks from now.


 Chapter 6: Centralized exiting of functions

            Albeit deprecated by some people, the equivalent of the goto
            statement is used frequently by compilers  in  form  of  the
            unconditional jump instruction.

            The goto statement comes in handy when a function exits from
            multiple locations and some common work such as cleanup  has
            to be done.

            The rationale is:

            -    unconditional  statements  are easier to understand and
                 follow

            -    nesting is reduced

            -    errors by not updating individual exit points when mak-
                 ing modifications are prevented

            -    saves the compiler work to optimize redundant code away
                 ;)


                      int fun(int )
                      {
                           int result = 0;
                           char *buffer = kmalloc(SIZE);

                           if (buffer == NULL)
                                 return -ENOMEM;

                           if (condition1) {
                                 while (loop1) {
                                      ...
                                 }
                                 result = 1;
                                 goto out;
                           }
                           ...
                      out:
                           kfree(buffer);
                           return result;
                      }



 Chapter 7: Commenting

            Comments are good, but there is also a danger  of  over-com-
            menting.  NEVER try to explain HOW your code works in a com-
            ment: it's much better to write the code so that the  _work-
            ing_  is  obvious, and it's a waste of time to explain badly
            written code.

            Generally, you want your comments to  tell  WHAT  your  code
            does, not HOW.  Also, try to avoid putting comments inside a
            function body: if the function is so complex that  you  need
            to  separately  comment  parts of it, you should probably go
            back to chapter 5 for a while.  You can make small  comments
            to  note  or  warn  about  something particularly clever (or
            ugly), but try to avoid excess.  Instead, put  the  comments
            at  the  head  of the function, telling people what it does,
            and possibly WHY it does it.


 Chapter 8: You've made a mess of it

            That's OK, we all do.  You've probably  been  told  by  your
            long-time  Unix  user  helper that "GNU emacs" automatically
            formats the C sources for you, and you've noticed that  yes,
            it  does  do  that,  but  the defaults it uses are less than
            desirable (in fact, they are worse than random typing  -  an
            infinite number of monkeys typing into GNU emacs would never
            make a good program).

            So, you can either get rid of GNU emacs, or change it to use
            saner values.  To do the latter, you can stick the following
            in your .emacs file:

                 (defun linux-c-mode ()
                 "C mode with adjusted defaults for use with the Linux kernel."
                   (interactive)
                   (c-mode)
                   (c-set-style "K&R")
                   (setq tab-width 8)
                   (setq indent-tabs-mode t)
                   (setq c-basic-offset 8))

            This will define the M-x linux-c-mode command.  When hacking
            on a module, if you put the string -*- linux-c -*- somewhere
            on the first two lines,  this  mode  will  be  automatically
            invoked. Also, you may want to add

            (setq auto-mode-alist (cons '("/usr/src/linux.*/.*\.[ch]$" .
            linux-c-mode)                auto-mode-alist))

            to your  .emacs  file  if  you  want  to  have  linux-c-mode
            switched  on  automagically when you edit source files under
            /usr/src/linux.

            But even if you fail in getting emacs to do sane formatting,
            not everything is lost: use "indent".

            Now, again, GNU indent has the same brain-dead settings that
            GNU emacs has, which is why you need to give it a  few  com-
            mand  line  options.   However,  that's not too bad, because
            even the makers of GNU indent recognize the authority of K&R
            (the  GNU  people  aren't  evil, they are just severely mis-
            guided in this matter), so you just give indent the  options
            "-kr  -i8"  (stands  for "K&R, 8 character indents"), or use
            "scripts/Lindent", which indents in the latest style.

            "indent" has a lot of options, and especially when it  comes
            to  comment re-formatting you may want to take a look at the
            man page.  But remember: "indent" is not a fix for bad  pro-
            gramming.


 Chapter 9: Configuration-files

            For  configuration  options  (arch/xxx/Kconfig,  and all the
            Kconfig files), somewhat different indentation is used.

            Help text is indented with 2 spaces.


                 if CONFIG_EXPERIMENTAL
                      tristate CONFIG_BOOM
                      default n
                      help
                        Apply nitroglycerine inside the keyboard (DANGEROUS)
                      bool CONFIG_CHEER
                      depends on CONFIG_BOOM
                      default y
                      help
                        Output nice messages when you explode
                 endif

            Generally, CONFIG_EXPERIMENTAL should surround  all  options
            not  considered  stable. All options that are known to trash
            data (experimental  write-  support  for  file-systems,  for
            instance)  should be denoted (DANGEROUS), other experimental
            options should be denoted (EXPERIMENTAL).


 Chapter 10: Data structures

            Data structures that have  visibility  outside  the  single-
            threaded  environment  they  are  created  and  destroyed in
            should always have reference counts.  In the kernel, garbage
            collection  doesn't  exist  (and  outside the kernel garbage
            collection is slow and inefficient), which  means  that  you
            absolutely _have_ to reference count all your uses.

            Reference  counting  means  that  you can avoid locking, and
            allows multiple users to have access to the  data  structure
            in  parallel  -  and not having to worry about the structure
            suddenly going away from under them just because they  slept
            or did something else for a while.

            Note  that  locking  is  _not_  a  replacement for reference
            counting.  Locking is used to keep data structures coherent,
            while  reference  counting is a memory management technique.
            Usually both are needed, and they are  not  to  be  confused
            with each other.

            Many data structures can indeed have two levels of reference
            counting, when there are users of different "classes".   The
            subclass  count  counts  the  number  of subclass users, and
            decrements the global count  just  once  when  the  subclass
            count goes to zero.

            Examples  of  this  kind of "multi-level-reference-counting"
            can be  found  in  memory  management  ("struct  mm_struct":
            mm_users  and  mm_count),  and  in  filesystem code ("struct
            super_block": s_count and s_active).

            Remember: if another thread can find  your  data  structure,
            and  you don't have a reference count on it, you almost cer-
            tainly have a bug.


 Chapter 11: Macros, Enums, Inline functions and RTL

            Names of macros defining constants and labels in  enums  are
            capitalized.

            #define CONSTANT 0x12345

            Enums are preferred when defining several related constants.

            CAPITALIZED macro names are appreciated  but  macros  resem-
            bling functions may be named in lower case.

            Generally,  inline functions are preferable to macros resem-
            bling functions.

            Macros with multiple statements should be enclosed in a do -
            while block:


                 #define macrofun(a, b, c)
                     do {
                          if (a == 5)
                          do_this(b, c);
                     } while (0)

            Things to avoid when using macros:

            1) macros that affect control flow:

                    #define FOO(x)
                        do {
                              if (blah(x) < 0)
                                   return -EBUGGERED;
                        } while(0)

            is  a  _very_  bad  idea.  It looks like a function call but
            exits the  "calling"  function;  don't  break  the  internal
            parsers of those who will read the code.

            2)  macros  that  depend  on  having a local variable with a
            magic name:

            #define FOO(val) bar(index, val)

            might look like a good thing, but  it's  confusing  as  hell
            when  one  reads  the  code  and it's prone to breakage from
            seemingly innocent changes.

            3) macros with arguments that are used as l-values: FOO(x) =
            y;  will  bite you if somebody e.g. turns FOO into an inline
            function.

            4) forgetting about precedence:  macros  defining  constants
            using  expressions  must enclose the expression in parenthe-
            ses. Beware of similar issues with macros using  parameters.

            #define CONSTANT 0x4000
            #define CONSTEXP (CONSTANT | 3)

            The  cpp  manual  deals  with  macros  exhaustively. The gcc
            internals manual also covers RTL which  is  used  frequently
            with assembly language in the kernel.


 Chapter 12: Printing kernel messages

            Kernel  developers  like to be seen as literate. Do mind the
            spelling of kernel messages to make a  good  impression.  Do
            not  use  crippled  words  like  "dont"  and use "do not" or
            "don't" instead.

            Kernel messages do not have to be terminated with a  period.

            Printing  numbers  in  parentheses  (%d)  adds  no value and
            should be avoided.


 Chapter 13: References

            The C Programming Language, Second Edition
            by Brian W. Kernighan and Dennis M. Ritchie.
            Prentice Hall, Inc., 1988.
            ISBN 0-13-110362-8 (paperback), 0-13-110370-9 (hardback).
            URL: http://cm.bell-labs.com/cm/cs/cbook/


            The Practice of Programming
            by Brian W. Kernighan and Rob Pike.
            Addison-Wesley, Inc., 1999.
            ISBN 0-201-61586-X.
            URL: http://cm.bell-labs.com/cm/cs/tpop/


            GNU manuals - where in compliance with K&R and this text - for cpp, gcc,
            gcc internals and indent, all available from http://www.gnu.org


            WG14 is the international standardization working group for the programming
            language C, URL: http://std.dkuug.dk/JTC1/SC22/WG14/


            --
            Last updated on 16 February 2004 by a community effort on LKML.


posted on 2012-03-31 16:10  Richard.FreeBSD  阅读(168)  评论(0编辑  收藏  举报

导航