xref: /dragonfly/share/man/man9/style.9 (revision 19fe1c42)
1.\" Copyright (c) 1995-2001 FreeBSD Inc.
2.\" All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\"    notice, this list of conditions and the following disclaimer.
9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\"    notice, this list of conditions and the following disclaimer in the
11.\"    documentation and/or other materials provided with the distribution.
12.\"
13.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16.\" ARE DISCLAIMED.  IN NO EVENT SHALL [your name] OR CONTRIBUTORS BE LIABLE
17.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23.\" SUCH DAMAGE.
24.\"
25.\"
26.Dd August 30, 2004
27.Dt STYLE 9
28.Os
29.Sh NAME
30.Nm style
31.Nd "kernel source file style guide"
32.Sh DESCRIPTION
33This file specifies the preferred style for kernel source files in the
34.Dx
35source tree.
36It is also a guide for preferred userland code style.
37Many of the style rules are implicit in the examples.
38Be careful to check the examples before assuming that
39.Nm
40is silent on an issue.
41.Bd -literal
42/*
43 * Style guide for DragonFly.  Based on the CSRG's KNF (Kernel Normal Form).
44 *
45 *	@(#)style	1.14 (Berkeley) 4/28/95
46 * $FreeBSD: src/share/man/man9/style.9,v 1.32.2.19 2002/04/14 19:28:03 asmodai Exp $
47 * $DragonFly: src/share/man/man9/style.9,v 1.21 2008/05/02 02:05:06 swildner Exp $
48 */
49
50/*
51 * VERY important single-line comments look like this.
52 */
53
54/* Most single-line comments look like this. */
55
56/*
57 * Multi-line comments look like this.  Make them real sentences.  Fill
58 * them so they look like real paragraphs.
59 */
60
61/*
62 * XXX in a comment indicates code which is incomplete, suboptimal,
63 * or otherwise deserving of further attention.
64 */
65
66.Ed
67.Pp
68Version control system ID tags should only exist once in a file
69(unlike this one).
70All VCS (version control system) revision identification from files obtained
71from elsewhere should be maintained in comments, including, where applicable,
72multiple IDs showing a file's history.
73In general, keep the IDs intact, including any
74.So Li $ Sc Ns s .
75There is no reason to add
76.Qq Li "From"
77in front of foreign VCS IDs.
78All VCS IDs should generally be placed in comments somewhere near the
79top of the source, typically either before or after the copyright message.
80.Pp
81Leave another blank line before the header files.
82.Pp
83Kernel include files (i.e.\&
84.Pa sys/*.h )
85come first; normally, include
86.In sys/types.h
87OR
88.In sys/param.h ,
89but not both.
90.In sys/types.h
91includes
92.In sys/cdefs.h ,
93and it is okay to depend on that.
94.Bd -literal
95#include <sys/types.h>	/* Non-local includes in angle brackets. */
96.Ed
97.Pp
98For a network program, put the network include files next.
99.Bd -literal
100#include <net/if.h>
101#include <net/if_dl.h>
102#include <net/route.h>
103#include <netinet/in.h>
104#include <protocols/rwhod.h>
105.Ed
106.Pp
107Do not use files in
108.Pa /usr/include
109for files in the kernel.
110.Pp
111Leave a blank line before the next group, the
112.Pa /usr
113include files,
114which should be sorted alphabetically by name.
115.Bd -literal
116#include <stdio.h>
117.Ed
118.Pp
119Global pathnames are defined in
120.In paths.h .
121Pathnames local
122to the program go in
123.Qq Pa pathnames.h
124in the local directory.
125.Bd -literal
126#include <paths.h>
127.Ed
128.Pp
129Leave another blank line before the user include files.
130.Bd -literal
131#include "pathnames.h"		/* Local includes in double quotes. */
132.Ed
133.Pp
134Do not
135.Ic #define
136or declare names in the implementation namespace except
137for implementing application interfaces.
138.Pp
139The names of
140.Dq unsafe
141macros (ones that have side effects), and the names of macros for
142manifest constants, are all in uppercase.
143The expansions of expression-like macros are either a single token
144or have outer parentheses.
145Put a single tab character between the
146.Ic #define
147and the macro name.
148If a macro is an inline expansion of a function, the function name is
149all in lowercase and the macro has the same name all in uppercase.
150.\" XXX the above conflicts with ANSI style where the names are the
151.\" same and you #undef the macro (if any) to get the function.
152.\" It is not followed for MALLOC(), and not very common if inline
153.\" functions are used.
154If a
155macro needs more than a single line, use braces
156.Ql ( \&{
157and
158.Ql \&} ) .
159Right-justify the
160backslashes; it makes it easier to read.
161If the macro encapsulates a compound statement, enclose it in a
162.Ic do
163loop,
164so that it can safely be used in
165.Ic if
166statements.
167Any final statement-terminating semicolon should be
168supplied by the macro invocation rather than the macro, to make parsing easier
169for pretty-printers and editors.
170.Bd -literal
171#define	MACRO(x, y) do {						\e
172	variable = (x) + (y);						\e
173	(y) += 2;							\e
174} while (0)
175.Ed
176.Pp
177Enumeration values are all uppercase.
178.Bd -literal
179enum enumtype { ONE, TWO } et;
180.Ed
181.Pp
182As fixed size integers the
183.Tn POSIX
184defined types are preferred:
185.Bd -literal -offset indent
186uint8_t		8 bits fixed size unsigned integer
187uint16_t	16 bits fixed size unsigned integer
188uint32_t	32 bits fixed size unsigned integer
189uint64_t	64 bits fixed size unsigned integer
190.Ed
191.Pp
192When declaring variables in structures, declare them sorted by use, then
193by size, and then in alphabetical order.
194The first category normally does not apply, but there are exceptions.
195Each one gets its own line.
196Try to make the structure
197readable by aligning the member names using either one or two tabs
198depending upon your judgment.
199You should use one tab if it suffices to align most of the member names.
200Names following extremely long types
201should be separated by a single space.
202.Pp
203Major structures should be declared at the top of the file in which they
204are used, or in separate header files if they are used in multiple
205source files.
206Use of the structures should be by separate declarations
207and should be
208.Ic extern
209if they are declared in a header file.
210.Bd -literal
211struct foo {
212	struct foo	*next;		/* List of active foo. */
213	struct mumble	amumble;	/* Comment for mumble. */
214	int		bar;		/* Try to align the comments. */
215	struct verylongtypename *baz;	/* Won't fit in 2 tabs. */
216};
217struct foo *foohead;			/* Head of global foo list. */
218.Ed
219.Pp
220Use
221.Xr queue 3
222macros rather than rolling your own lists, whenever possible.
223Thus,
224the previous example would be better written:
225.Bd -literal
226#include <sys/queue.h>
227
228struct foo {
229	LIST_ENTRY(foo)	link;		/* Use queue macros for foo lists. */
230	struct mumble	amumble;	/* Comment for mumble. */
231	int		bar;		/* Try to align the comments. */
232	struct verylongtypename *baz;	/* Won't fit in 2 tabs. */
233};
234LIST_HEAD(, foo) foohead;		/* Head of global foo list. */
235.Ed
236.Pp
237Avoid using typedefs for structure types.
238This makes it impossible
239for applications to use pointers to such a structure opaquely, which
240is both possible and beneficial when using an ordinary struct tag.
241When convention requires a
242.Ic typedef ,
243make its name match the struct tag.
244Avoid typedefs ending in
245.Dq Li _t ,
246except as specified in Standard C or by
247.Tn POSIX .
248.Bd -literal
249/* Make the structure name match the typedef. */
250typedef struct bar {
251	int	level;
252} BAR;
253typedef	int		foo;		/* This is foo. */
254typedef	const long	baz;		/* This is baz. */
255.Ed
256.Pp
257All functions are prototyped somewhere.
258.Pp
259Function prototypes for private functions (i.e. functions not used
260elsewhere) go at the top of the first source module.
261Functions
262local to one source module should be declared
263.Ic static .
264.Pp
265Functions used from other parts of the kernel are prototyped in the
266relevant include file.
267.Pp
268Functions that are used locally in more than one module go into a
269separate header file, e.g.\&
270.Qq Pa extern.h .
271.Pp
272Do not use the
273.Ic register
274keyword and the
275.Dv __P
276macro from the include file
277.In sys/cdefs.h .
278Code in the
279.Dx
280source tree is not expected to be K&R compliant.
281.Pp
282Changes to existing files should be consistent with that file's conventions.
283In general, code can be considered
284.Dq "new code"
285when it makes up about 50% or more of the file(s) involved.
286This is enough
287to break precedents in the existing code and use the current
288.Nm
289guidelines.
290.Pp
291Function prototypes for the kernel have parameter names associated
292with parameter types. E.g., in the kernel use:
293.Bd -literal
294void	function(int fd);
295.Ed
296.Pp
297Prototypes that are visible to userland applications
298should not include parameter names with the types, to avoid
299possible collisions with defined macro names.
300I.e., use:
301.Bd -literal
302void	function(int);
303.Ed
304.Pp
305Prototypes may have an extra space after a tab to enable function names
306to line up:
307.Bd -literal
308static char	*function(int, const char *, struct foo *, struct bar *,
309			  struct baz **);
310static void	 usage(void);
311
312/*
313 * All major routines should have a comment briefly describing what
314 * they do.  The comment before the "main" routine should describe
315 * what the program does.
316 */
317int
318main(int argc, char **argv)
319{
320	long num;
321	int ch;
322	char *ep;
323
324.Ed
325.Pp
326For consistency,
327.Xr getopt 3
328should be used to parse options.
329Options
330should be sorted in the
331.Xr getopt 3
332call and the
333.Ic switch
334statement, unless
335parts of the
336.Ic switch
337cascade.
338Elements in a
339.Ic switch
340statement that cascade should have a
341.Li FALLTHROUGH
342comment, unless they contain no code of their own, as in the
343.Ic case '?'
344element in the example below.
345Numerical arguments should be checked for accuracy.
346Code that cannot be reached should have a
347.Li NOTREACHED
348comment.
349.Bd -literal
350	while ((ch = getopt(argc, argv, "abn:")) != -1)
351		switch (ch) {		/* Indent the switch. */
352		case 'a':		/* Don't indent the case. */
353			aflag = 1;
354			/* FALLTHROUGH */
355		case 'b':
356			bflag = 1;
357			break;
358		case 'n':
359			num = strtol(optarg, &ep, 10);
360			if (num <= 0 || *ep != '\e0') {
361				warnx("illegal number, -n argument -- %s",
362				    optarg);
363				usage();
364			}
365			break;
366		case '?':
367		default:
368			usage();
369			/* NOTREACHED */
370		}
371	argc -= optind;
372	argv += optind;
373.Ed
374.Pp
375Put a single space after control statement keywords
376.Pq Ic if , do , while , for , switch .
377No braces are
378used for control statements with zero or only a single statement unless that
379statement is more than a single line in which case they are permitted.
380.Sq Forever
381loops (loops with no test expression, which are only terminated by a
382.Ic break ,
383.Ic return
384or
385.Ic exit
386inside the loop body) are done with
387.Ic for Ns 's ,
388not
389.Ic while Ns 's .
390.Bd -literal
391	for (p = buf; *p != '\e0'; ++p)
392		;	/* nothing */
393	for (;;)
394		stmt;
395	for (;;) {
396		z = a + really + long + statement + that + needs +
397		    two + lines + gets + indented + four + spaces +
398		    on + the + second + and + subsequent + lines;
399	}
400	for (;;) {
401		if (cond)
402			stmt;
403	}
404	if (val != NULL)
405		val = realloc(val, newsize);
406.Ed
407.Pp
408Parts of a
409.Ic for
410loop may be left empty.
411Do not put declarations
412inside blocks unless the routine is unusually complicated.
413.Bd -literal
414	for (; cnt < 15; cnt++) {
415		stmt1;
416		stmt2;
417	}
418.Ed
419.Pp
420Indentation used for program block structure is an 8 character tab.
421Second level indents used for line continuation are four spaces.
422If you have to wrap a long statement, put the operator at the end of the
423line.
424.Bd -literal
425	while (cnt < 20 && this_variable_name_is_really_far_too_long &&
426	    ep != NULL) {
427		z = a + really + long + statement + that + needs +
428		    two + lines + gets + indented + four + spaces +
429		    on + the + second + and + subsequent + lines;
430	}
431.Ed
432.Pp
433Do not add whitespace at the end of a line, and only use tabs
434followed by spaces
435to form the indentation.
436Do not use more spaces than a tab will produce
437and do not use spaces in front of tabs.
438.Pp
439Closing and opening braces go on the same line as the
440.Ic else .
441Braces that are not necessary may be left out, but always use braces around
442complex or confusing sequences, for example if any part of a conditional is
443multi-line, use braces for all parts of the conditional, and use braces
444around multi-line substatements of loops or conditionals even if they are
445theoretically one statement from the compiler's point of view.
446.Bd -literal
447	if (test)
448		stmt;
449	else if (bar)
450		stmt;
451	else
452		stmt;
453
454	if (test) {
455		stmt;
456	} else if (bar) {
457		stmt;
458		stmt;
459	} else {
460		stmt;
461	}
462
463	/* THIS IS WRONG, BRACES SHOULD BE USED */
464	if (fubar)
465		/* xyz */
466		x = 1;
467
468	/* THIS IS ALSO WRONG, USE BRACES AROUND THE OUTER CONDITIONAL */
469	if (fubar)
470		if (barbaz)
471			x = 1;
472.Ed
473.Pp
474Do not put spaces after function names,
475after
476.Ql \&(
477or
478.Ql \&[
479characters, or preceding
480.Ql \&] ,
481.Ql \&) ,
482.Ql \&; ,
483or
484.Ql \&,
485characters.
486But do put a space after commas and semicolons if there is
487further text on the same line.
488.Bd -literal
489	error = function(a1, a2);
490	if (error != 0)
491		exit(error);
492.Ed
493.Pp
494Unary operators do not require spaces around them,
495but binary operators (except for
496.Ql \&.
497and
498.Ql \&-> )
499do.
500Do not use parentheses unless they are required for precedence or unless the
501statement is confusing without them.
502Remember that other people may become
503confused more easily than you.
504Do YOU understand the following?
505.Bd -literal
506	a = b->c[0] + ~d == (e || f) || g && h ? i : j >> 1;
507	k = !(l & FLAGS);
508.Ed
509.Pp
510Casts are not followed by a space.
511Note that
512.Xr indent 1
513does not understand this rule.
514Also, for the purposes of formatting, treat
515.Ic return
516and
517.Ic sizeof
518as functions.  In other words, they are not
519followed by a space, and their single argument
520should be enclosed in parentheses.
521.Pp
522Exits should be 0 on success, or according to the predefined
523values in
524.Xr sysexits 3 .
525.Bd -literal
526	exit(EX_OK);	/*
527			 * Avoid obvious comments such as
528			 * "Exit 0 on success."
529			 */
530}
531.Ed
532.Pp
533The function type should be on a line by itself
534preceding the function.
535.Bd -literal
536static char *
537function(int a1, int a2, float fl, int a4)
538{
539.Ed
540.Pp
541When declaring variables in functions declare them sorted by size,
542then in alphabetical order; multiple ones per line are okay.
543If a line overflows reuse the type keyword.
544.Pp
545Be careful to not obfuscate the code by initializing variables in
546the declarations.
547Use this feature only thoughtfully.
548DO NOT use function calls in initializers.
549.Bd -literal
550	struct foo one, *two;
551	double three;
552	int *four, five;
553	char *six, seven, eight, nine, ten, eleven, twelve;
554
555	four = myfunction();
556.Ed
557.Pp
558Do not declare functions inside other functions; ANSI C says that
559such declarations have file scope regardless of the nesting of the
560declaration.
561Hiding file declarations in what appears to be a local
562scope is undesirable and will elicit complaints from a good compiler.
563.Pp
564.Dv NULL
565is the preferred null pointer constant.
566Use
567.Dv NULL
568instead of
569.Vt ( "type *" ) Ns 0
570or
571.Vt ( "type *" ) Ns Dv NULL
572in contexts where the compiler knows the
573type, e.g., in assignments.
574Use
575.Vt ( "type *" ) Ns Dv NULL
576in other contexts,
577in particular for all function args.
578(Casting is essential for
579variadic args and is necessary for other args if the function prototype
580might not be in scope.)
581Test pointers against
582.Dv NULL ,
583e.g., use:
584.Bd -literal
585(p = f()) == NULL
586.Ed
587.Pp
588not:
589.Bd -literal
590!(p = f())
591.Ed
592.Pp
593Do not use
594.Ic \&!
595for tests unless it is a boolean, e.g. use
596.Bd -literal
597if (*p == '\e0')
598.Ed
599.Pp
600not
601.Bd -literal
602if (!*p)
603.Ed
604.Pp
605Do not cast the unused return value of a function to (void).
606.Pp
607Routines returning
608.Vt "void *"
609should not have their return values cast
610to any pointer type.
611.Pp
612Use
613.Xr err 3
614or
615.Xr warn 3 ,
616do not roll your own.
617.Bd -literal
618	if ((four = malloc(sizeof(struct foo))) == NULL)
619		err(1, (char *)NULL);
620	if ((six = (int *)overflow()) == NULL)
621		errx(1, "number overflowed");
622	return(eight);
623}
624.Ed
625.Pp
626Avoid old-style function declarations that look like this:
627.Bd -literal
628static char *
629function(a1, a2, fl, a4)
630	int a1, a2;	/* Declare ints, too, don't default them. */
631	float fl;	/* Beware double vs. float prototype differences. */
632	int a4;		/* List in order declared. */
633{
634.Ed
635.Pp
636Use ANSI function declarations instead.
637Long parameter lists are wrapped so that the first parameter on each line
638lines up.
639.Pp
640Try to avoid using obsolete functions such as:
641.Xr ftime 3 ,
642.Xr getwd 3 ,
643.Xr index 3 ,
644.Xr rindex 3 ,
645.Xr mktemp 3 ,
646.Xr utimes 3
647and
648.Xr wcswcs 3 .
649.Pp
650All new code must avoid using unbounded string functions.  For example,
651.Xr strlcpy 3
652should be used instead of
653.Xr strcpy 3 ,
654and
655.Xr snprintf 3
656should be used instead of
657.Xr sprintf 3 .
658.Pp
659Varargs procedures should be formatted as follows:
660.Bd -literal
661#include <stdarg.h>
662
663void
664vaf(const char *fmt, ...)
665{
666	va_list va;
667
668	va_start(va, fmt);
669	STUFF;
670	va_end(va);
671	/* No return needed for void functions. */
672}
673.Ed
674.Pp
675Use
676.Xr printf 3 ,
677not
678.Xr fputs 3 ,
679.Xr puts 3 ,
680.Xr putchar 3 ,
681whatever; it is faster and usually cleaner, not
682to mention avoiding stupid bugs.
683.Pp
684Usage statements should look like the manual pages
685.Sx SYNOPSIS .
686The usage statement should be structured in the following order:
687.Bl -enum
688.It
689Options without operands come first,
690in alphabetical order,
691inside a single set of brackets
692.Ql ( \&[
693and
694.Ql \&] ) .
695.It
696Options with operands come next,
697also in alphabetical order,
698with each option and its argument inside its own pair of brackets.
699.It
700Required arguments
701(if any)
702are next,
703listed in the order they should be specified on the command line.
704.It
705Finally,
706any optional arguments should be listed,
707listed in the order they should be specified,
708and all inside brackets.
709.El
710.Pp
711A bar
712.Pq Ql \&|
713separates
714.Dq either-or
715options/arguments,
716and multiple options/arguments which are specified together are
717placed in a single set of brackets.
718.Bd -literal -offset 4n
719"usage: f [-aDde] [-b b_arg] [-m m_arg] req1 req2 [opt1 [opt2]]\en"
720"usage: f [-a | -b] [-c [-dEe] [-n number]]\en"
721.Ed
722.Bd -literal
723	fprintf(stderr, "usage: f [-ab]\en");
724	exit(EX_USAGE);
725}
726.Ed
727.Pp
728Note that the manual page options description should list the options in
729pure alphabetical order.
730That is, without regard to whether an option takes arguments or not.
731The alphabetical ordering should take into account the case ordering
732shown above.
733.Pp
734New core kernel code should be reasonably compliant with the
735.Nm
736guides.
737The guidelines for third-party maintained modules and device drivers are more
738relaxed but at a minimum should be internally consistent with their style.
739.Pp
740Stylistic changes (including whitespace changes) are hard on the source
741repository and are to be avoided without good reason.
742Code that is approximately
743.Dx
744KNF
745.Nm
746compliant in the repository must not diverge from compliance.
747.Pp
748Whenever possible, code should be run through a code checker
749(e.g.,
750.Xr lint 1
751or
752.Nm gcc Fl Wall )
753and produce minimal warnings.
754.Sh SEE ALSO
755.Xr indent 1 ,
756.Xr lint 1 ,
757.Xr err 3 ,
758.Xr sysexits 3 ,
759.Xr warn 3
760.Sh HISTORY
761This man page is largely based on the
762.Pa src/admin/style/style
763file from the
764.Bx 4.4 Lite2
765release, with occasional updates to reflect the current practice and
766desire of the
767.Dx
768project.
769