xref: /freebsd/share/man/man9/style.9 (revision a3557ef0)
1.\"-
2.\" Copyright (c) 1995-2019 The FreeBSD Project
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.\"	From: @(#)style	1.14 (Berkeley) 4/28/95
26.\" $FreeBSD$
27.\"
28.Dd January 10, 2020
29.Dt STYLE 9
30.Os
31.Sh NAME
32.Nm style
33.Nd "kernel source file style guide"
34.Sh DESCRIPTION
35This file specifies the preferred style for kernel source files in the
36.Fx
37source tree.
38It is also a guide for the preferred userland code style.
39Many of the style rules are implicit in the examples.
40Be careful to check the examples before assuming that
41.Nm
42is silent on an issue.
43.Bd -literal
44/*
45 * Style guide for FreeBSD.  Based on the CSRG's KNF (Kernel Normal Form).
46 *
47 *	@(#)style	1.14 (Berkeley) 4/28/95
48 * $FreeBSD$
49 */
50
51/*
52 * VERY important single-line comments look like this.
53 */
54
55/* Most single-line comments look like this. */
56
57/*
58 * Multi-line comments look like this.  Make them real sentences.  Fill
59 * them so they look like real paragraphs.
60 */
61.Ed
62.Pp
63The copyright header should be a multi-line comment, with the first
64line of the comment having a dash after the star like so:
65.Bd -literal
66/*-
67 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
68 *
69 * Copyright (c) 1984-2025 John Q. Public
70 *
71 * Long, boring license goes here, but trimmed for brevity
72 */
73.Ed
74.Pp
75An automatic script collects license information from the tree for
76all comments that start in the first column with
77.Dq Li "/*-" .
78If you desire to flag
79.Xr indent 1
80to not reformat a comment that starts in the first column which is not a
81license or copyright notice, change the dash to a star for those
82comments.
83Comments starting in columns other than the first are never
84considered license statements.
85Use the appropriate SPDX-License-Identifier line before the copyright.
86If the copyright assertion contains the phrase
87.Dq Li "All Rights Reserved"
88that should be on the same line as the word
89.Dq Li "Copyright" .
90You should not insert a new copyright line between an old
91copyright line and this phrase.
92Instead, you should insert a new copyright phrase after
93a pre-existing
94.Dq Li "All Rights Reserved"
95line.
96When making changes, it is acceptable to fold an
97.Dq Li "All Rights Reserved"
98line with each of the
99.Dq Li "Copyright"
100lines.
101For files that have the
102.Dq Li "All Rights Reserved"
103line on the same line(s) as the word
104.Dq Li "Copyright" ,
105new copyright assertions should be added last.
106New
107.Dq Li "Copyright"
108lines should only be added when making substantial changes to the file,
109not for trivial changes.
110.Pp
111After any copyright and license comment, there is a blank line, and the
112.Li $\&FreeBSD$
113for non C/C++ language source files.
114Version control system ID tags should only exist once in a file
115(unlike in this one).
116Non-C/C++ source files follow the example above, while C/C++ source files
117follow the one below.
118All VCS (version control system) revision identification in files obtained
119from elsewhere should be maintained, including, where applicable, multiple IDs
120showing a file's history.
121In general, do not edit foreign IDs or their infrastructure.
122Unless otherwise wrapped (such as
123.Dq Li "#if defined(LIBC_SCCS)" ) ,
124enclose both in
125.Dq Li "#if 0 ... #endif"
126to hide any uncompilable bits
127and to keep the IDs out of object files.
128Only add
129.Dq Li "From: "
130in front of foreign VCS IDs if the file is renamed.
131.Bd -literal
132/* From: @(#)style	1.14 (Berkeley) 4/28/95 */
133
134#include <sys/cdefs.h>
135__FBSDID("$FreeBSD$");
136.Ed
137.Pp
138Leave one blank line before the header files.
139.Pp
140Kernel include files
141.Pa ( sys/*.h )
142come first.
143If
144.In sys/cdefs.h
145is needed for
146.Fn __FBSDID ,
147include it first.
148If either
149.In sys/types.h
150or
151.In sys/param.h
152is needed, include it before other include files.
153.Po
154.In sys/param.h
155includes
156.In sys/types.h ;
157do not include both.
158.Pc
159The remaining kernel headers should be sorted alphabetically.
160.Bd -literal
161#include <sys/types.h>	/* Non-local includes in angle brackets. */
162#include <sys/endian.h>
163#include <sys/lock.h>
164#include <sys/queue.h>
165.Ed
166.Pp
167For a network program, put the network include files next.
168.Bd -literal
169#include <net/if.h>
170#include <net/if_dl.h>
171#include <net/route.h>
172#include <netinet/in.h>
173#include <protocols/rwhod.h>
174.Ed
175.Pp
176Do not include files from
177.Pa /usr/include
178in the kernel.
179.Pp
180Leave a blank line before the next group, the
181.Pa /usr/include
182files,
183which should be sorted alphabetically by name.
184.Bd -literal
185#include <stdio.h>
186.Ed
187.Pp
188Global pathnames are defined in
189.In paths.h .
190Pathnames local
191to the program go in
192.Qq Pa pathnames.h
193in the local directory.
194.Bd -literal
195#include <paths.h>
196.Ed
197.Pp
198Leave another blank line before the local include files.
199.Bd -literal
200#include "pathnames.h"		/* Local includes in double quotes. */
201.Ed
202.Pp
203Do not
204.Ic #define
205or declare names in the implementation namespace except
206for implementing application interfaces.
207.Pp
208The names of
209.Dq unsafe
210macros (ones that have side effects), and the names of macros for
211manifest constants, are all in uppercase.
212The expansions of expression-like macros are either a single token
213or have outer parentheses.
214Put a single tab character between the
215.Ic #define
216and the macro name.
217If a macro is an inline expansion of a function, the function name is
218all in lowercase and the macro has the same name all in uppercase.
219.\" XXX the above conflicts with ANSI style where the names are the
220.\" same and you #undef the macro (if any) to get the function.
221.\" It is not followed for MALLOC(), and not very common if inline
222.\" functions are used.
223Right-justify the
224backslashes; it makes it easier to read.
225If the macro encapsulates a compound statement, enclose it in a
226.Ic do
227loop,
228so that it can safely be used in
229.Ic if
230statements.
231Any final statement-terminating semicolon should be
232supplied by the macro invocation rather than the macro, to make parsing easier
233for pretty-printers and editors.
234.Bd -literal
235#define	MACRO(x, y) do {						\e
236	variable = (x) + (y);						\e
237	(y) += 2;							\e
238} while (0)
239.Ed
240.Pp
241When code is conditionally compiled using
242.Ic #ifdef
243or
244.Ic #if ,
245a comment may be added following the matching
246.Ic #endif
247or
248.Ic #else
249to permit the reader to easily discern where conditionally compiled code
250regions end.
251This comment should be used only for (subjectively) long regions, regions
252greater than 20 lines, or where a series of nested
253.Ic #ifdef 's
254may be confusing to the reader.
255The comment should be separated from the
256.Ic #endif
257or
258.Ic #else
259by a single space.
260For short conditionally compiled regions, a closing comment should not be
261used.
262.Pp
263The comment for
264.Ic #endif
265should match the expression used in the corresponding
266.Ic #if
267or
268.Ic #ifdef .
269The comment for
270.Ic #else
271and
272.Ic #elif
273should match the inverse of the expression(s) used in the preceding
274.Ic #if
275and/or
276.Ic #elif
277statements.
278In the comments, the subexpression
279.Dq Li defined(FOO)
280is abbreviated as
281.Dq Li FOO .
282For the purposes of comments,
283.Dq Ic #ifndef Li FOO
284is treated as
285.Dq Ic #if Li !defined(FOO) .
286.Bd -literal
287#ifdef KTRACE
288#include <sys/ktrace.h>
289#endif
290
291#ifdef COMPAT_43
292/* A large region here, or other conditional code. */
293#else /* !COMPAT_43 */
294/* Or here. */
295#endif /* COMPAT_43 */
296
297#ifndef COMPAT_43
298/* Yet another large region here, or other conditional code. */
299#else /* COMPAT_43 */
300/* Or here. */
301#endif /* !COMPAT_43 */
302.Ed
303.Pp
304The project prefers the use of
305.St -isoC-99
306unsigned integer identifiers of the form
307.Vt uintXX_t
308rather than the older
309.Bx Ns -style
310integer identifiers of the form
311.Vt u_intXX_t .
312New code should use the former, and old code should be converted to
313the new form if other major work is being done in that area and
314there is no overriding reason to prefer the older
315.Bx Ns -style .
316Like white-space commits, care should be taken in making
317.Vt uintXX_t
318only commits.
319.Pp
320Similarly, the project prefers the use of
321ISO C99
322.Vt bool
323rather than the older
324.Vt int
325or
326.Vt boolean_t .
327New code should use
328.Vt bool ,
329and old code may be converted if it is
330reasonable to do so.
331Literal values are named
332.Dv true
333and
334.Dv false .
335These are preferred to the old spellings
336.Dv TRUE
337and
338.Dv FALSE .
339Userspace code should include
340.In stdbool.h ,
341while kernel code should include
342.In sys/types.h .
343.Pp
344Likewise, the project prefers
345ISO C99
346designated initializers when it makes sense to do so.
347.Pp
348Enumeration values are all uppercase.
349.Bd -literal
350enum enumtype { ONE, TWO } et;
351.Ed
352.Pp
353The use of internal_underscores in identifiers is preferred over
354camelCase or TitleCase.
355.Pp
356In declarations, do not put any whitespace between asterisks and
357adjacent tokens, except for tokens that are identifiers related to
358types.
359(These identifiers are the names of basic types, type
360qualifiers, and
361.Ic typedef Ns -names
362other than the one being declared.)
363Separate these identifiers from asterisks using a single space.
364.Pp
365When declaring variables in structures, declare them sorted by use, then
366by size (largest to smallest), and then in alphabetical order.
367The first category normally does not apply, but there are exceptions.
368Each one gets its own line.
369Try to make the structure
370readable by aligning the member names using either one or two tabs
371depending upon your judgment.
372You should use one tab only if it suffices to align at least 90% of
373the member names.
374Names following extremely long types
375should be separated by a single space.
376.Pp
377Major structures should be declared at the top of the file in which they
378are used, or in separate header files if they are used in multiple
379source files.
380Use of the structures should be by separate declarations
381and should be
382.Ic extern
383if they are declared in a header file.
384.Bd -literal
385struct foo {
386	struct foo	*next;		/* List of active foo. */
387	struct mumble	amumble;	/* Comment for mumble. */
388	int		bar;		/* Try to align the comments. */
389	struct verylongtypename *baz;	/* Does not fit in 2 tabs. */
390};
391struct foo *foohead;			/* Head of global foo list. */
392.Ed
393.Pp
394Use
395.Xr queue 3
396macros rather than rolling your own lists, whenever possible.
397Thus,
398the previous example would be better written:
399.Bd -literal
400#include <sys/queue.h>
401
402struct foo {
403	LIST_ENTRY(foo)	link;		/* Use queue macros for foo lists. */
404	struct mumble	amumble;	/* Comment for mumble. */
405	int		bar;		/* Try to align the comments. */
406	struct verylongtypename *baz;	/* Does not fit in 2 tabs. */
407};
408LIST_HEAD(, foo) foohead;		/* Head of global foo list. */
409.Ed
410.Pp
411Avoid using typedefs for structure types.
412Typedefs are problematic because they do not properly hide their
413underlying type; for example you need to know if the typedef is
414the structure itself or a pointer to the structure.
415In addition they must be declared exactly once, whereas an
416incomplete structure type can be mentioned as many times as
417necessary.
418Typedefs are difficult to use in stand-alone header files:
419the header that defines the typedef must be included
420before the header that uses it, or by the header that uses
421it (which causes namespace pollution), or there must be a
422back-door mechanism for obtaining the typedef.
423.Pp
424When convention requires a
425.Ic typedef ,
426make its name match the struct tag.
427Avoid typedefs ending in
428.Dq Li _t ,
429except as specified in Standard C or by POSIX.
430.Bd -literal
431/* Make the structure name match the typedef. */
432typedef	struct bar {
433	int	level;
434} BAR;
435typedef	int		foo;		/* This is foo. */
436typedef	const long	baz;		/* This is baz. */
437.Ed
438.Pp
439All functions are prototyped somewhere.
440.Pp
441Function prototypes for private functions (i.e., functions not used
442elsewhere) go at the top of the first source module.
443Functions
444local to one source module should be declared
445.Ic static .
446.Pp
447Functions used from other parts of the kernel are prototyped in the
448relevant include file.
449Function prototypes should be listed in a logical order, preferably
450alphabetical unless there is a compelling reason to use a different
451ordering.
452.Pp
453Functions that are used locally in more than one module go into a
454separate header file, e.g.,
455.Qq Pa extern.h .
456.Pp
457Do not use the
458.Dv __P
459macro.
460.Pp
461In general code can be considered
462.Dq "new code"
463when it makes up about 50% or more of the file(s) involved.
464This is enough
465to break precedents in the existing code and use the current
466.Nm
467guidelines.
468.Pp
469The kernel has a name associated with parameter types, e.g., in the kernel
470use:
471.Bd -literal
472void	function(int fd);
473.Ed
474.Pp
475In header files visible to userland applications, prototypes that are
476visible must use either
477.Dq protected
478names (ones beginning with an underscore)
479or no names with the types.
480It is preferable to use protected names.
481E.g., use:
482.Bd -literal
483void	function(int);
484.Ed
485.Pp
486or:
487.Bd -literal
488void	function(int _fd);
489.Ed
490.Pp
491Prototypes may have an extra space after a tab to enable function names
492to line up:
493.Bd -literal
494static char	*function(int _arg, const char *_arg2, struct foo *_arg3,
495		    struct bar *_arg4);
496static void	 usage(void);
497
498/*
499 * All major routines should have a comment briefly describing what
500 * they do.  The comment before the "main" routine should describe
501 * what the program does.
502 */
503int
504main(int argc, char *argv[])
505{
506	char *ep;
507	long num;
508	int ch;
509.Ed
510.Pp
511For consistency,
512.Xr getopt 3
513should be used to parse options.
514Options
515should be sorted in the
516.Xr getopt 3
517call and the
518.Ic switch
519statement, unless
520parts of the
521.Ic switch
522cascade.
523Elements in a
524.Ic switch
525statement that cascade should have a
526.Li FALLTHROUGH
527comment.
528Numerical arguments should be checked for accuracy.
529Code which is unreachable for non-obvious reasons may be marked /*
530.Li NOTREACHED
531*/.
532.Bd -literal
533	while ((ch = getopt(argc, argv, "abNn:")) != -1)
534		switch (ch) {		/* Indent the switch. */
535		case 'a':		/* Do not indent the case. */
536			aflag = 1;	/* Indent case body one tab. */
537			/* FALLTHROUGH */
538		case 'b':
539			bflag = 1;
540			break;
541		case 'N':
542			Nflag = 1;
543			break;
544		case 'n':
545			num = strtol(optarg, &ep, 10);
546			if (num <= 0 || *ep != '\e0') {
547				warnx("illegal number, -n argument -- %s",
548				    optarg);
549				usage();
550			}
551			break;
552		case '?':
553		default:
554			usage();
555		}
556	argc -= optind;
557	argv += optind;
558.Ed
559.Pp
560Space after keywords
561.Pq Ic if , while , for , return , switch .
562Two styles of braces
563.Ql ( \&{
564and
565.Ql \&} )
566are allowed for single line statements.
567Either they are used for all single statements, or
568they are used only where needed for clarity.
569Usage within a function should be consistent.
570Forever loops are done with
571.Ic for Ns 's ,
572not
573.Ic while Ns 's .
574.Bd -literal
575	for (p = buf; *p != '\e0'; ++p)
576		;	/* nothing */
577	for (;;)
578		stmt;
579	for (;;) {
580		z = a + really + long + statement + that + needs +
581		    two + lines + gets + indented + four + spaces +
582		    on + the + second + and + subsequent + lines;
583	}
584	for (;;) {
585		if (cond)
586			stmt;
587	}
588	if (val != NULL)
589		val = realloc(val, newsize);
590.Ed
591.Pp
592Parts of a
593.Ic for
594loop may be left empty.
595Do not put declarations
596inside blocks unless the routine is unusually complicated.
597.Bd -literal
598	for (; cnt < 15; cnt++) {
599		stmt1;
600		stmt2;
601	}
602.Ed
603.Pp
604Indentation is an 8 character tab.
605Second level indents are four spaces.
606If you have to wrap a long statement, put the operator at the end of the
607line.
608.Bd -literal
609	while (cnt < 20 && this_variable_name_is_too_long &&
610	    ep != NULL)
611		z = a + really + long + statement + that + needs +
612		    two + lines + gets + indented + four + spaces +
613		    on + the + second + and + subsequent + lines;
614.Ed
615.Pp
616Do not add whitespace at the end of a line, and only use tabs
617followed by spaces
618to form the indentation.
619Do not use more spaces than a tab will produce
620and do not use spaces in front of tabs.
621.Pp
622Closing and opening braces go on the same line as the
623.Ic else .
624Braces that are not necessary may be left out.
625.Bd -literal
626	if (test)
627		stmt;
628	else if (bar) {
629		stmt;
630		stmt;
631	} else
632		stmt;
633.Ed
634.Pp
635No spaces after function names.
636Commas have a space after them.
637No spaces
638after
639.Ql \&(
640or
641.Ql \&[
642or preceding
643.Ql \&]
644or
645.Ql \&)
646characters.
647.Bd -literal
648	error = function(a1, a2);
649	if (error != 0)
650		exit(error);
651.Ed
652.Pp
653Unary operators do not require spaces, binary operators do.
654Do not use parentheses unless they are required for precedence or unless the
655statement is confusing without them.
656Remember that other people may
657confuse easier than you.
658Do YOU understand the following?
659.Bd -literal
660	a = b->c[0] + ~d == (e || f) || g && h ? i : j >> 1;
661	k = !(l & FLAGS);
662.Ed
663.Pp
664Exits should be 0 on success, or 1 on failure.
665.Bd -literal
666	exit(0);	/*
667			 * Avoid obvious comments such as
668			 * "Exit 0 on success."
669			 */
670}
671.Ed
672.Pp
673The function type should be on a line by itself
674preceding the function.
675The opening brace of the function body should be
676on a line by itself.
677.Bd -literal
678static char *
679function(int a1, int a2, float fl, int a4)
680{
681.Ed
682.Pp
683When declaring variables in functions declare them sorted by size,
684then in alphabetical order; multiple ones per line are okay.
685If a line overflows reuse the type keyword.
686.Pp
687Be careful to not obfuscate the code by initializing variables in
688the declarations.
689Use this feature only thoughtfully.
690DO NOT use function calls in initializers.
691.Bd -literal
692	struct foo one, *two;
693	double three;
694	int *four, five;
695	char *six, seven, eight, nine, ten, eleven, twelve;
696
697	four = myfunction();
698.Ed
699.Pp
700Do not declare functions inside other functions; ANSI C says that
701such declarations have file scope regardless of the nesting of the
702declaration.
703Hiding file declarations in what appears to be a local
704scope is undesirable and will elicit complaints from a good compiler.
705.Pp
706Casts and
707.Ic sizeof Ns 's
708are not followed by a space.
709Note that
710.Xr indent 1
711does not understand this rule.
712.Ic sizeof Ns 's
713are written with parenthesis always.
714The redundant parenthesis rules do not apply to
715.Fn sizeof var
716instances.
717.Pp
718.Dv NULL
719is the preferred null pointer constant.
720Use
721.Dv NULL
722instead of
723.Vt ( "type *" ) Ns 0
724or
725.Vt ( "type *" ) Ns Dv NULL
726in contexts where the compiler knows the
727type, e.g., in assignments.
728Use
729.Vt ( "type *" ) Ns Dv NULL
730in other contexts,
731in particular for all function args.
732(Casting is essential for
733variadic args and is necessary for other args if the function prototype
734might not be in scope.)
735Test pointers against
736.Dv NULL ,
737e.g., use:
738.Bd -literal
739(p = f()) == NULL
740.Ed
741.Pp
742not:
743.Bd -literal
744!(p = f())
745.Ed
746.Pp
747Do not use
748.Ic \&!
749for tests unless it is a boolean, e.g., use:
750.Bd -literal
751if (*p == '\e0')
752.Ed
753.Pp
754not:
755.Bd -literal
756if (!*p)
757.Ed
758.Pp
759Routines returning
760.Vt "void *"
761should not have their return values cast
762to any pointer type.
763.Pp
764Values in
765.Ic return
766statements should be enclosed in parentheses.
767.Pp
768Use
769.Xr err 3
770or
771.Xr warn 3 ,
772do not roll your own.
773.Bd -literal
774	if ((four = malloc(sizeof(struct foo))) == NULL)
775		err(1, (char *)NULL);
776	if ((six = (int *)overflow()) == NULL)
777		errx(1, "number overflowed");
778	return (eight);
779}
780.Ed
781.Pp
782When converting K&R style declarations to ANSI style, preserve
783any comments about parameters.
784.Pp
785Long parameter lists are wrapped with a normal four space indent.
786.Pp
787Variable numbers of arguments should look like this:
788.Bd -literal
789#include <stdarg.h>
790
791void
792vaf(const char *fmt, ...)
793{
794	va_list ap;
795
796	va_start(ap, fmt);
797	STUFF;
798	va_end(ap);
799	/* No return needed for void functions. */
800}
801
802static void
803usage(void)
804{
805	/* Optional blank line goes here. */
806.Ed
807.Pp
808Optionally, insert a blank line at the beginning of functions with no local
809variables.
810Older versions of this
811.Nm
812document required the blank line convention, so it is widely used in existing
813code.
814.Pp
815Do not insert a blank line at the beginning of functions with local variables.
816Instead, these should have local variable declarations first, followed by one
817blank line, followed by the first statement.
818.Pp
819Use
820.Xr printf 3 ,
821not
822.Xr fputs 3 ,
823.Xr puts 3 ,
824.Xr putchar 3 ,
825whatever; it is faster and usually cleaner, not
826to mention avoiding stupid bugs.
827.Pp
828Usage statements should look like the manual pages
829.Sx SYNOPSIS .
830The usage statement should be structured in the following order:
831.Bl -enum
832.It
833Options without operands come first,
834in alphabetical order,
835inside a single set of brackets
836.Ql ( \&[
837and
838.Ql \&] ) .
839.It
840Options with operands come next,
841also in alphabetical order,
842with each option and its argument inside its own pair of brackets.
843.It
844Required arguments
845(if any)
846are next,
847listed in the order they should be specified on the command line.
848.It
849Finally,
850any optional arguments should be listed,
851listed in the order they should be specified,
852and all inside brackets.
853.El
854.Pp
855A bar
856.Pq Ql \&|
857separates
858.Dq either-or
859options/arguments,
860and multiple options/arguments which are specified together are
861placed in a single set of brackets.
862.Bd -literal -offset 4n
863"usage: f [-aDde] [-b b_arg] [-m m_arg] req1 req2 [opt1 [opt2]]\en"
864"usage: f [-a | -b] [-c [-dEe] [-n number]]\en"
865.Ed
866.Bd -literal
867	(void)fprintf(stderr, "usage: f [-ab]\en");
868	exit(1);
869}
870.Ed
871.Pp
872Note that the manual page options description should list the options in
873pure alphabetical order.
874That is, without regard to whether an option takes arguments or not.
875The alphabetical ordering should take into account the case ordering
876shown above.
877.Pp
878New core kernel code should be reasonably compliant with the
879.Nm
880guides.
881The guidelines for third-party maintained modules and device drivers are more
882relaxed but at a minimum should be internally consistent with their style.
883.Pp
884Stylistic changes (including whitespace changes) are hard on the source
885repository and are to be avoided without good reason.
886Code that is approximately
887.Fx
888KNF
889.Nm
890compliant in the repository must not diverge from compliance.
891.Pp
892Whenever possible, code should be run through a code checker
893(e.g., various static analyzers or
894.Nm cc Fl Wall )
895and produce minimal warnings.
896.Pp
897New code should use
898.Fn _Static_assert
899instead of the older
900.Fn CTASSERT .
901.Sh FILES
902.Bl -tag -width indent
903.It Pa /usr/src/tools/tools/editing/freebsd.el
904An Emacs plugin to follow the
905.Fx
906.Nm
907indentation rules.
908.It Pa /usr/src/tools/tools/editing/freebsd.vim
909A Vim plugin to follow the
910.Fx
911.Nm
912indentation rules.
913.El
914.Sh SEE ALSO
915.Xr indent 1 ,
916.Xr err 3 ,
917.Xr warn 3 ,
918.Xr style.Makefile 5 ,
919.Xr style.lua 9
920.Sh HISTORY
921This manual page is largely based on the
922.Pa src/admin/style/style
923file from the
924.Bx 4.4 Lite2
925release, with occasional updates to reflect the current practice and
926desire of the
927.Fx
928project.
929.Pa src/admin/style/style
930is a codification by the CSRG of the programming style of Ken Thompson and
931Dennis Ritchie in
932.At v6 .
933