xref: /linux/Documentation/translations/sp_SP/process/coding-style.rst (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1.. include:: ../disclaimer-sp.rst
2
3:Original: :ref:`Documentation/process/coding-style.rst <submittingpatches>`
4:Translator: Carlos Bilbao <carlos.bilbao.osdev@gmail.com>
5
6.. _sp_codingstyle:
7
8Estilo en el código del kernel Linux
9=====================================
10
11Este es un breve documento que describe el estilo preferido en el código
12del kernel Linux. El estilo de código es muy personal y no **forzaré** mi
13puntos de vista sobre nadie, pero esto vale para todo lo que tengo que
14mantener, y preferiría que para la mayoría de otras cosas también. Por
15favor, por lo menos considere los argumentos expuestos aquí.
16
17En primer lugar, sugeriría imprimir una copia de los estándares de código
18GNU, y NO leerlo. Quémelos, es un gran gesto simbólico.
19
20De todos modos, aquí va:
21
22
231) Sangría
24-----------
25
26Las tabulaciones tienen 8 caracteres y, por lo tanto, las sangrías también
27tienen 8 caracteres. Hay movimientos heréticos que intentan hacer sangría
28de 4 (¡o incluso 2!) caracteres de longitud, y eso es similar a tratar de
29definir el valor de PI como 3.
30
31Justificación: La idea detrás de la sangría es definir claramente dónde
32comienza y termina un bloque de control. Especialmente, cuando ha estado
33buscando en su pantalla durante 20 horas seguidas, le resultará mucho más
34fácil ver cómo funciona la sangría si tiene sangrías grandes.
35
36Bueno, algunas personas dirán que tener sangrías de 8 caracteres hace que
37el código se mueva demasiado a la derecha y dificulta la lectura en una
38pantalla de terminal de 80 caracteres. La respuesta a eso es que si
39necesita más de 3 niveles de sangría, está en apuros de todos modos y
40debería arreglar su programa.
41
42En resumen, las sangrías de 8 caracteres facilitan la lectura y tienen la
43ventaja añadida de advertirle cuando está anidando sus funciones demasiado
44profundo. Preste atención a esa advertencia.
45
46La forma preferida de facilitar múltiples niveles de sangría en una
47declaración de switch es para alinear el ``switch`` y sus etiquetas
48``case`` subordinadas en la misma columna, en lugar de hacer ``doble
49sangría`` (``double-indenting``) en etiquetas ``case``. Por ejemplo:
50
51.. code-block:: c
52
53	switch (suffix) {
54	case 'G':
55	case 'g':
56		mem <<= 30;
57		break;
58	case 'M':
59	case 'm':
60		mem <<= 20;
61		break;
62	case 'K':
63	case 'k':
64		mem <<= 10;
65		fallthrough;
66	default:
67		break;
68	}
69
70No ponga varias declaraciones en una sola línea a menos que tenga algo que
71ocultar:
72
73.. code-block:: c
74
75	if (condición) haz_esto;
76	  haz_otra_cosa;
77
78No use comas para evitar el uso de llaves:
79
80.. code-block:: c
81
82	if (condición)
83		haz_esto(), haz_eso();
84
85Siempre use llaves para múltiples declaraciones:
86
87.. code-block:: c
88
89	if (condición) {
90		haz_esto();
91		haz_eso();
92	}
93
94Tampoco ponga varias asignaciones en una sola línea. El estilo de código
95del kernel es súper simple. Evite las expresiones engañosas.
96
97
98Aparte de los comentarios, la documentación y excepto en Kconfig, los
99espacios nunca se utilizan para la sangría, y el ejemplo anterior se rompe
100deliberadamente.
101
102Consiga un editor decente y no deje espacios en blanco al final de las
103líneas.
104
1052) Rompiendo líneas y strings largos
106------------------------------------
107
108El estilo de código tiene todo que ver con la legibilidad y la
109mantenibilidad usando herramientas disponibles comúnmente.
110
111El límite preferido en la longitud de una sola línea es de 80 columnas.
112
113Las declaraciones de más de 80 columnas deben dividirse en partes, a menos
114que exceder las 80 columnas aumente significativamente la legibilidad y no
115oculte información.
116
117Los descendientes siempre son sustancialmente más cortos que el padre y
118se colocan sustancialmente a la derecha. Un estilo muy usado es alinear
119descendientes a un paréntesis de función abierto.
120
121Estas mismas reglas se aplican a los encabezados de funciones con una larga
122lista de argumentos.
123
124Sin embargo, nunca rompa los strings visibles para el usuario, como los
125mensajes printk, porque eso rompe la capacidad de grep a estos.
126
127
1283) Colocación de llaves y espacios
129----------------------------------
130
131El otro problema que siempre surge en el estilo C es la colocación de
132llaves. A diferencia del tamaño de la sangría, existen pocas razones
133técnicas para elegir una estrategia de ubicación sobre la otra, pero la
134forma preferida, como mostraron los profetas Kernighan y Ritchie, es poner
135la llave de apertura en la línea, y colocar la llave de cierre primero,
136así:
137
138.. code-block:: c
139
140	if (x es verdad) {
141		hacemos y
142	}
143
144Esto se aplica a todos los bloques de declaraciones que no son funciones
145(if, switch, for, while, do). Por ejemplo:
146
147.. code-block:: c
148
149	switch (action) {
150	case KOBJ_ADD:
151		return "add";
152	case KOBJ_REMOVE:
153		return "remove";
154	case KOBJ_CHANGE:
155		return "change";
156	default:
157		return NULL;
158	}
159
160Sin embargo, hay un caso especial, a saber, las funciones: tienen la llave
161de apertura al comienzo de la siguiente línea, así:
162
163.. code-block:: c
164
165	int funcion(int x)
166	{
167		cuerpo de la función
168	}
169
170Gente hereje de todo el mundo ha afirmado que esta inconsistencia es...
171bueno... inconsistente, pero todas las personas sensatas saben que
172(a) K&R tienen **razón** y (b) K&R tienen razón. Además, las funciones son
173especiales de todos modos (no puede anidarlas en C).
174
175Tenga en cuenta que la llave de cierre está vacía en su línea propia,
176**excepto** en los casos en que es seguida por una continuación de la misma
177declaración, es decir, un ``while`` en una sentencia do o un ``else`` en
178una sentencia if, como en:
179
180.. code-block:: c
181
182	do {
183		cuerpo del bucle do
184	} while (condition);
185
186y
187
188.. code-block:: c
189
190	if (x == y) {
191		..
192	} else if (x > y) {
193		...
194	} else {
195		....
196	}
197
198Justificación: K&R.
199
200Además, tenga en cuenta que esta colocación de llaves también minimiza el
201número de líneas vacías (o casi vacías), sin pérdida de legibilidad. Así,
202como el suministro de nuevas líneas en su pantalla no es un recurso
203renovable (piense en pantallas de terminal de 25 líneas), tienes más líneas
204vacías para poner comentarios.
205
206No use llaves innecesariamente donde una sola declaración sea suficiente.
207
208.. code-block:: c
209
210	if (condition)
211		accion();
212
213y
214
215.. code-block:: none
216
217	if (condición)
218		haz_esto();
219	else
220		haz_eso();
221
222Esto no aplica si solo una rama de una declaración condicional es una sola
223declaración; en este último caso utilice llaves en ambas ramas:
224
225.. code-block:: c
226
227	if (condición) {
228		haz_esto();
229		haz_eso();
230	} else {
231		en_otro_caso();
232	}
233
234Además, use llaves cuando un bucle contenga más de una declaración simple:
235
236.. code-block:: c
237
238	while (condición) {
239		if (test)
240			haz_eso();
241	}
242
2433.1) Espacios
244*************
245
246El estilo del kernel Linux para el uso de espacios depende (principalmente)
247del uso de función versus uso de palabra clave. Utilice un espacio después
248de (la mayoría de) las palabras clave. Las excepciones notables son sizeof,
249typeof, alignof y __attribute__, que parecen algo así como funciones (y
250generalmente se usan con paréntesis en Linux, aunque no son requeridos en
251el idioma, como en: ``sizeof info`` después de que ``struct fileinfo info;``
252se declare).
253
254Así que use un espacio después de estas palabras clave::
255
256	if, switch, case, for, do, while
257
258pero no con sizeof, typeof, alignof, o __attribute__. Por ejemplo,
259
260.. code-block:: c
261
262
263	s = sizeof(struct file);
264
265No agregue espacios alrededor (dentro) de expresiones entre paréntesis.
266Este ejemplo es **malo**:
267
268.. code-block:: c
269
270
271	s = sizeof( struct file );
272
273Al declarar datos de puntero o una función que devuelve un tipo de puntero,
274el uso preferido de ``*`` es adyacente al nombre del dato o nombre de la
275función y no junto al nombre del tipo. Ejemplos:
276
277.. code-block:: c
278
279
280	char *linux_banner;
281	unsigned long long memparse(char *ptr, char **retptr);
282	char *match_strdup(substring_t *s);
283
284Use un espacio alrededor (a cada lado de) la mayoría de los operadores
285binarios y ternarios, como cualquiera de estos::
286
287	=  +  -  <  >  *  /  %  |  &  ^  <=  >=  ==  !=  ?  :
288
289pero sin espacio después de los operadores unarios::
290
291	&  *  +  -  ~  !  sizeof  typeof  alignof  __attribute__  defined
292
293sin espacio antes de los operadores unarios de incremento y decremento del
294sufijo::
295
296	++  --
297
298y sin espacio alrededor de los operadores de miembros de estructura ``.`` y
299``->``.
300
301No deje espacios en blanco al final de las líneas. Algunos editores con
302``inteligente`` sangría insertarán espacios en blanco al comienzo de las
303nuevas líneas como sea apropiado, para que pueda comenzar a escribir la
304siguiente línea de código de inmediato. Sin embargo, algunos de estos
305editores no eliminan los espacios en blanco si finalmente no termina
306poniendo una línea de código allí, como si dejara una línea en blanco. Como
307resultado, termina con líneas que contienen espacios en blanco al final.
308
309Git le advertirá sobre los parches que introducen espacios en blanco al
310final y puede, opcionalmente, eliminar los espacios en blanco finales por
311usted; sin embargo, si se aplica una serie de parches, esto puede hacer que
312los parches posteriores de la serie fallen al cambiar sus líneas de
313contexto.
314
315
3164) Nomenclatura
317---------------
318
319C es un lenguaje espartano, y sus convenciones de nomenclatura deberían
320seguir su ejemplo. A diferencia de los programadores de Modula-2 y Pascal,
321los programadores de C no usan nombres cuquis como
322EstaVariableEsUnContadorTemporal. Un programador de C lo llamaría
323variable ``tmp``, que es mucho más fácil de escribir, y no es mas difícil
324de comprender.
325
326SIN EMBARGO, mientras que los nombres de mayúsculas y minúsculas están mal
327vistos, los nombres descriptivos para las variables globales son
328imprescindibles. Llamar a una función global ``foo`` es un delito.
329
330Una variable GLOBAL (para usar solo si **realmente** las necesita) necesita
331tener un nombre descriptivo, al igual que las funciones globales. Si tiene
332una función que cuenta el número de usuarios activos, debe llamar a esta
333``contar_usuarios_activos()`` o similar, **no** debe llamarlo ``cntusr()``.
334
335Codificar el tipo de una función en el nombre (lo llamado notación húngara)
336es estúpido: el compilador conoce los tipos de todos modos y puede
337verificar estos, y solo confunde al programador.
338
339Los nombres de las variables LOCALES deben ser breves y directos. Si usted
340tiene algún contador aleatorio de tipo entero, probablemente debería
341llamarse ``i``. Llamarlo ``loop_counter`` no es productivo, si no hay
342posibilidad de ser mal entendido. De manera similar, ``tmp`` puede ser casi
343cualquier tipo de variable que se utiliza para contener un valor temporal.
344
345Si tiene miedo de mezclar los nombres de las variables locales, tiene otro
346problema, que se denomina síndrome de
347función-crecimiento-desequilibrio-de-hormona. Vea el capítulo 6 (Funciones).
348
349Para nombres de símbolos y documentación, evite introducir nuevos usos de
350'master / slave' (maestro / esclavo) (o 'slave' independientemente de
351'master') y 'lista negra / lista blanca' (backlist / whitelist).
352
353Los reemplazos recomendados para 'maestro / esclavo' son:
354    '{primary,main} / {secondary,replica,subordinate}'
355    '{initiator,requester} / {target,responder}'
356    '{controller,host} / {device,worker,proxy}'
357    'leader / follower'
358    'director / performer'
359
360Los reemplazos recomendados para 'backlist / whitelist' son:
361    'denylist / allowlist'
362    'blocklist / passlist'
363
364Las excepciones para la introducción de nuevos usos son mantener en espacio
365de usuario una ABI/API, o al actualizar la especificación del código de un
366hardware o protocolo existente (a partir de 2020) que requiere esos
367términos. Para nuevas especificaciones, traduzca el uso de la terminología
368de la especificación al estándar de código del kernel donde sea posible.
369
3705) Typedefs
371-----------
372
373Por favor no use cosas como ``vps_t``.
374Es un **error** usar typedef para estructuras y punteros. cuando ve un
375
376.. code-block:: c
377
378
379	vps_t a;
380
381en el código fuente, ¿qué significa?
382En cambio, si dice
383
384.. code-block:: c
385
386	struct virtual_container *a;
387
388puede decir qué es ``a`` en realidad.
389
390Mucha gente piensa que  los typedefs ``ayudan a la legibilidad``. No. Son
391útiles solamente para:
392
393 (a) objetos totalmente opacos (donde el typedef se usa activamente para
394     **ocultar** cuál es el objeto).
395
396     Ejemplo: ``pte_t`` etc. objetos opacos a los que solo puede acceder
397     usando las funciones de acceso adecuadas.
398
399     .. note::
400
401       La opacidad y las ``funciones de acceso`` no son buenas por sí
402       mismas. La razón por la que los tenemos para cosas como pte_t, etc.
403       es que hay real y absolutamente **cero** información accesible de
404       forma portátil allí.
405
406 (b) Tipos enteros claros, donde la abstracción **ayuda** a evitar
407     confusiones, ya sea ``int`` o ``long``.
408
409     u8/u16/u32 son definiciones tipográficas perfectamente correctas
410     aunque encajan en la categoría (d) mejor que aquí.
411
412     .. note::
413
414       De nuevo - debe haber una **razón** para esto. si algo es
415       ``unsigned long``, entonces no hay razón para hacerlo
416
417	typedef unsigned long mis_flags_t;
418
419     pero si hay una razón clara de por qué bajo ciertas circunstancias
420     podría ser un ``unsigned int`` y bajo otras configuraciones podría
421     ser ``unsigned long``, entonces, sin duda, adelante y use un typedef.
422
423 (c) cuando lo use para crear literalmente un tipo **nuevo** para
424     comprobación de tipos.
425
426 (d) Nuevos tipos que son idénticos a los tipos estándar C99, en ciertas
427     circunstancias excepcionales.
428
429     Aunque sólo costaría un corto período de tiempo para los ojos y
430     cerebro para acostumbrarse a los tipos estándar como ``uint32_t``,
431     algunas personas se oponen a su uso de todos modos.
432
433     Por lo tanto, los tipos ``u8/u16/u32/u64`` específicos de Linux y sus
434     equivalentes con signo, que son idénticos a los tipos estándar son
435     permitidos, aunque no son obligatorios en el nuevo código de su
436     elección.
437
438     Al editar código existente que ya usa uno u otro conjunto de tipos,
439     debe ajustarse a las opciones existentes en ese código.
440
441 (e) Tipos seguros para usar en el espacio de usuario.
442
443     En ciertas estructuras que son visibles para el espacio de usuario, no
444     podemos requerir tipos C99 y o utilizat el ``u32`` anterior. Por lo
445     tanto, usamos __u32 y tipos similares en todas las estructuras que se
446     comparten con espacio de usuario.
447
448Tal vez también haya otros casos, pero la regla básicamente debería ser
449NUNCA JAMÁS use un typedef a menos que pueda coincidir claramente con una
450de estas reglas.
451
452En general, un puntero o una estructura que tiene elementos que pueden
453ser razonablemente accedidos directamente, **nunca** deben ser un typedef.
454
4556) Funciones
456------------
457
458Las funciones deben ser cortas y dulces, y hacer una sola cosa. Deberían
459caber en una o dos pantallas de texto (el tamaño de pantalla ISO/ANSI es
46080x24, como todos sabemos), y hacer una cosa y hacerla bien.
461
462La longitud máxima de una función es inversamente proporcional a la
463complejidad y el nivel de sangría de esa función. Entonces, si tiene una
464función conceptualmente simple que es solo una larga (pero simple)
465declaración de case, donde tiene que hacer un montón de pequeñas cosas para
466un montón de diferentes casos, está bien tener una función más larga.
467
468Sin embargo, si tiene una función compleja y sospecha que un estudiante de
469primer año de secundaria menos que dotado podría no comprender de qué se
470trata la función, debe adherirse a los límites máximos tanto más de
471cerca. Use funciones auxiliares con nombres descriptivos (puede pedirle al
472compilador que los alinee si cree que es crítico para el rendimiento, y
473probablemente lo hará mejor de lo que usted hubiera hecho).
474
475Otra medida de la función es el número de variables locales. Estas no deben
476exceder de 5 a 10, o está haciendo algo mal. Piense de nuevo en la función
477y divida en partes más pequeñas. Un cerebro humano puede generalmente
478realiza un seguimiento de aproximadamente 7 cosas diferentes, cualquier
479elemento más y se confunde. Usted sabe que es brillante, pero tal vez le
480gustaría entender lo que hizo dentro de 2 semanas.
481
482En los archivos fuente, separe las funciones con una línea en blanco. Si la
483función es exportada, la macro **EXPORT** debería ponerse inmediatamente
484después de la función de cierre de línea de llave. Por ejemplo:
485
486.. code-block:: c
487
488	int sistema_corriendo(void)
489	{
490		return estado_sistema == SISTEMA_CORRIENDO;
491	}
492	EXPORT_SYMBOL(sistema_corriendo);
493
4946.1) Prototipos de funciones
495****************************
496
497En los prototipos de funciones, incluya nombres de parámetros con sus tipos
498de datos. Aunque esto no es requerido por el lenguaje C, se prefiere en
499Linux porque es una forma sencilla de añadir información valiosa para el
500lector.
501
502No utilice la palabra clave ``extern`` con declaraciones de función ya que
503esto hace las líneas más largas y no es estrictamente necesario.
504
505Al escribir prototipos de funciones, mantenga el `orden de los elementos regular
506<https://lore.kernel.org/mm-commits/CAHk-=wiOCLRny5aifWNhr621kYrJwhfURsa0vFPeUEm8mF0ufg@mail.gmail.com/>`_.
507Por ejemplo, usando este ejemplo de declaración de función::
508
509 __init void * __must_check action(enum magic value, size_t size, u8 count,
510				   char *fmt, ...) __printf(4, 5) __malloc;
511
512El orden preferido de elementos para un prototipo de función es:
513
514- clase de almacenamiento (a continuación, ``static __always_inline``,
515  teniendo en cuenta que ``__always_inline`` es técnicamente un atributo
516  pero se trata como ``inline``)
517- atributos de clase de almacenamiento (aquí, ``__init`` -- es decir,
518  declaraciones de sección, pero también cosas como ``__cold``)
519- tipo de retorno (aquí, ``void *``)
520- atributos de tipo de retorno (aquí, ``__must_check``)
521- nombre de la función (aquí, ``action``)
522- parámetros de la función (aquí, ``(enum magic value, size_t size, u8 count, char *fmt, ...)``,
523  teniendo en cuenta que los nombres de los parámetros siempre deben
524  incluirse)
525- atributos de parámetros de función (aquí, ``__printf(4, 5)``)
526- atributos de comportamiento de la función (aquí, ``__malloc``)
527
528Tenga en cuenta que para una **definición** de función (es decir, el cuerpo
529real de la función), el compilador no permite atributos de parámetros de
530función después de parámetros de la función. En estos casos, deberán ir
531tras los atributos de clase (por ejemplo, tenga en cuenta el cambio de
532posición de ``__printf(4, 5)`` a continuación, en comparación con el
533ejemplo de **declaración** anterior)::
534
535 static __always_inline __init __printf(4, 5) void * __must_check action(enum magic value,
536		size_t size, u8 count, char *fmt, ...) __malloc
537 {
538	...
539 }
540
5417) Salida centralizada de funciones
542-----------------------------------
543
544Aunque desaprobado por algunas personas, el equivalente de la instrucción
545goto es utilizado con frecuencia por los compiladores, en forma de
546instrucción de salto incondicional.
547
548La declaración goto es útil cuando una función sale desde múltiples
549ubicaciones y se deben realizar algunos trabajos comunes, como la limpieza.
550Si no se necesita limpieza, entonces simplemente haga return directamente.
551
552Elija nombres de etiquetas que digan qué hace el goto o por qué existe el
553goto. Un ejemplo de un buen nombre podría ser ``out_free_buffer:``
554(``salida_liberar_buffer``) si al irse libera ``buffer``. Evite usar
555nombres GW-BASIC como ``err1:`` y ``err2:``, ya que tendría que volver a
556numerarlos si alguna vez agrega o elimina rutas de salida, y hacen que sea
557difícil de verificar que sean correctos, de todos modos.
558
559La razón para usar gotos es:
560
561- Las declaraciones incondicionales son más fáciles de entender y seguir.
562- se reduce el anidamiento
563- errores al no actualizar los puntos de salida individuales al hacer
564  modificaciones son evitados
565- ahorra el trabajo del compilador de optimizar código redundante ;)
566
567.. code-block:: c
568
569	int fun(int a)
570	{
571		int result = 0;
572		char *buffer;
573
574		buffer = kmalloc(SIZE, GFP_KERNEL);
575		if (!buffer)
576			return -ENOMEM;
577
578		if (condition1) {
579			while (loop1) {
580				...
581			}
582			result = 1;
583			goto out_free_buffer;
584		}
585		...
586	out_free_buffer:
587		kfree(buffer);
588		return result;
589	}
590
591Un tipo común de error a tener en cuenta es "un error de error" que es algo
592así:
593
594.. code-block:: c
595
596	err:
597		kfree(foo->bar);
598		kfree(foo);
599		return ret;
600
601El error en este código es que en algunas rutas de salida, ``foo`` es NULL.
602Normalmente la solución para esto es dividirlo en dos etiquetas de error
603``err_free_bar:`` y ``err_free_foo:``:
604
605.. code-block:: c
606
607	err_free_bar:
608		kfree(foo->bar);
609	err_free_foo:
610		kfree(foo);
611		return ret;
612
613Idealmente, debería simular errores para probar todas las rutas de salida.
614
615
6168) Comentarios
617--------------
618
619Los comentarios son buenos, pero también existe el peligro de comentar
620demasiado. NUNCA trate de explicar CÓMO funciona su código en un
621comentario: es mucho mejor escribir el código para que el
622**funcionamiento** sea obvio y es una pérdida de tiempo explicar código mal
623escrito.
624
625Generalmente, desea que sus comentarios digan QUÉ hace su código, no CÓMO.
626Además, trate de evitar poner comentarios dentro del cuerpo de una función:
627si la función es tan compleja que necesita comentar por separado partes de
628esta, probablemente debería volver al capítulo 6 una temporada. Puede
629hacer pequeños comentarios para notar o advertir sobre algo particularmente
630inteligente (o feo), pero trate de evitar el exceso. En su lugar, ponga los
631comentarios al principio de la función, diga a la gente lo que hace y
632posiblemente POR QUÉ hace esto.
633
634Al comentar las funciones de la API del kernel, utilice el formato
635kernel-doc. Consulte los archivos en :ref:`Documentation/doc-guide/ <doc_guide>`
636y ``scripts/kernel-doc`` para más detalles.
637
638El estilo preferido para comentarios largos (de varias líneas) es:
639
640.. code-block:: c
641
642	/*
643	* Este es el estilo preferido para comentarios
644	* multilínea en el código fuente del kernel Linux.
645	* Por favor, utilícelo constantemente.
646	*
647	* Descripción: Una columna de asteriscos en el lado izquierdo,
648	* con líneas iniciales y finales casi en blanco.
649	*/
650
651Para archivos en net/ y drivers/net/, el estilo preferido para comentarios
652largos (multi-linea) es un poco diferente.
653
654.. code-block:: c
655
656	/* El estilo de comentario preferido para archivos en net/ y drivers/net
657	* se asemeja a esto.
658	*
659	* Es casi lo mismo que el estilo de comentario generalmente preferido,
660	* pero no hay una línea inicial casi en blanco.
661	*/
662
663También es importante comentar los datos, ya sean tipos básicos o
664derivados. Para este fin, use solo una declaración de datos por línea (sin
665comas para múltiples declaraciones de datos). Esto le deja espacio para un
666pequeño comentario sobre cada elemento, explicando su uso.
667
6689) Has hecho un desastre
669---------------------------
670
671Está bien, todos lo hacemos. Probablemente un antiguo usuario de Unix le
672haya dicho que ``GNU emacs`` formatea automáticamente las fuentes C por
673usted, y ha notado que sí, lo hace, pero los por defecto que tiene son
674menos que deseables (de hecho, son peores que los aleatorios) escribiendo -
675un número infinito de monos escribiendo en GNU emacs nunca harán un buen
676programa).
677
678Por lo tanto, puede deshacerse de GNU emacs o cambiarlo y usar valores más
679sanos. Para hacer esto último, puede pegar lo siguiente en su archivo
680.emacs:
681
682.. code-block:: none
683
684  (defun c-lineup-arglist-tabs-only (ignored)
685    "Line up argument lists by tabs, not spaces"
686    (let* ((anchor (c-langelem-pos c-syntactic-element))
687           (column (c-langelem-2nd-pos c-syntactic-element))
688           (offset (- (1+ column) anchor))
689           (steps (floor offset c-basic-offset)))
690      (* (max steps 1)
691         c-basic-offset)))
692
693  (dir-locals-set-class-variables
694   'linux-kernel
695   '((c-mode . (
696          (c-basic-offset . 8)
697          (c-label-minimum-indentation . 0)
698          (c-offsets-alist . (
699                  (arglist-close         . c-lineup-arglist-tabs-only)
700                  (arglist-cont-nonempty .
701                      (c-lineup-gcc-asm-reg c-lineup-arglist-tabs-only))
702                  (arglist-intro         . +)
703                  (brace-list-intro      . +)
704                  (c                     . c-lineup-C-comments)
705                  (case-label            . 0)
706                  (comment-intro         . c-lineup-comment)
707                  (cpp-define-intro      . +)
708                  (cpp-macro             . -1000)
709                  (cpp-macro-cont        . +)
710                  (defun-block-intro     . +)
711                  (else-clause           . 0)
712                  (func-decl-cont        . +)
713                  (inclass               . +)
714                  (inher-cont            . c-lineup-multi-inher)
715                  (knr-argdecl-intro     . 0)
716                  (label                 . -1000)
717                  (statement             . 0)
718                  (statement-block-intro . +)
719                  (statement-case-intro  . +)
720                  (statement-cont        . +)
721                  (substatement          . +)
722                  ))
723          (indent-tabs-mode . t)
724          (show-trailing-whitespace . t)
725          ))))
726
727  (dir-locals-set-directory-class
728   (expand-file-name "~/src/linux-trees")
729   'linux-kernel)
730
731Esto hará que emacs funcione mejor con el estilo de código del kernel para
732C en archivos bajo ``~/src/linux-trees``.
733
734Pero incluso si no logra que emacs realice un formateo correcto, no todo
735está perdido: use ``indent``.
736
737Ahora bien, de nuevo, la sangría de GNU tiene la misma configuración de
738muerte cerebral que GNU emacs tiene, por lo que necesita darle algunas
739opciones de línea de comando. Sin embargo, eso no es tan malo, porque
740incluso los creadores de GNU indent reconocen la autoridad de K&R (la gente
741de GNU no es mala, solo están gravemente equivocados en este asunto), por
742lo que simplemente de a la sangría las opciones ``-kr -i8`` (significa
743``K&R, guiones de 8 caracteres``), o use ``scripts/Lindent``, que indenta
744con ese estilo.
745
746``indent`` tiene muchas opciones, y especialmente cuando se trata de
747comentar reformateos, es posible que desee echar un vistazo a la página del
748manual. Pero recuerde: ``indent`` no es la solución para una mala
749programación.
750
751Tenga en cuenta que también puede usar la herramienta ``clang-format`` para
752ayudarlo con estas reglas, para volver a formatear rápidamente partes de su
753código automáticamente, y revisar archivos completos para detectar errores
754de estilo del código, errores tipográficos y posibles mejoras. También es
755útil para ordenar ``#includes``, para alinear variables/macros, para
756redistribuir texto y otras tareas similares. Vea el archivo
757:ref:`Documentation/dev-tools/clang-format.rst <clangformat>` para más
758detalles.
759
76010) Archivos de configuración de Kconfig
761----------------------------------------
762
763Para todos los archivos de configuración de Kconfig* en todo el árbol
764fuente, la sangría es algo diferente. Las líneas bajo una definición
765``config`` están indentadas con una tabulación, mientras que el texto de
766ayuda tiene una sangría adicional de dos espacios. Ejemplo::
767
768  config AUDIT
769	bool "Soporte para auditar"
770	depends on NET
771	help
772	  Habilita la infraestructura de auditoría que se puede usar con otro
773	  subsistema kernel, como SELinux (que requiere esto para
774	  registro de salida de mensajes avc). No hace auditoría de llamadas al
775    sistema sin CONFIG_AUDITSYSCALL.
776
777Características seriamente peligrosas (como soporte de escritura para
778ciertos filesystems) deben anunciar esto de forma destacada en su cadena de
779solicitud::
780
781  config ADFS_FS_RW
782	bool "ADFS write support (DANGEROUS)"
783	depends on ADFS_FS
784	...
785
786Para obtener la documentación completa sobre los archivos de configuración,
787consulte el archivo Documentation/kbuild/kconfig-language.rst.
788
789
79011) Estructuras de datos
791------------------------
792
793Las estructuras de datos que tienen visibilidad fuera del contexto de un
794solo subproceso en el que son creadas y destruidas, siempre debe tener
795contadores de referencia. En el kernel, la recolección de basura no existe
796(y fuera, la recolección de basura del kernel es lenta e ineficiente), lo
797que significa que absolutamente **tiene** para hacer referencia y contar
798todos sus usos.
799
800El conteo de referencias significa que puede evitar el bloqueo y permite
801que múltiples usuarios tengan acceso a la estructura de datos en paralelo -
802y no tengan que preocuparse de que la estructura, de repente, desaparezca
803debajo de su control, solo porque durmieron o hicieron otra cosa por un
804tiempo.
805
806Tenga en cuenta que el bloqueo **no** reemplaza el recuento de referencia.
807El bloqueo se utiliza para mantener la coherencia de las estructuras de
808datos, mientras que la referencia y contar es una técnica de gestión de
809memoria. Por lo general, ambos son necesarios, y no deben confundirse entre
810sí.
811
812De hecho, muchas estructuras de datos pueden tener dos niveles de conteo de
813referencias, cuando hay usuarios de diferentes ``clases``. El conteo de
814subclases cuenta el número de usuarios de la subclase y disminuye el conteo
815global solo una vez, cuando el recuento de subclases llega a cero.
816
817Se pueden encontrar ejemplos de este tipo de ``recuento de referencias de
818niveles múltiples`` en la gestión de memoria (``struct mm_struct``:
819mm_users y mm_count), y en código del sistema de archivos
820(``struct super_block``: s_count y s_active).
821
822Recuerde: si otro hilo puede encontrar su estructura de datos y usted no
823tiene un recuento de referencias, es casi seguro que tiene un error.
824
82512) Macros, Enums y RTL
826------------------------
827
828Los nombres de macros que definen constantes y etiquetas en enumeraciones
829(enums) están en mayúsculas.
830
831.. code-block:: c
832
833	#define CONSTANTE 0x12345
834
835Se prefieren los enums cuando se definen varias constantes relacionadas.
836
837Se aprecian los nombres de macro en MAYÚSCULAS, pero las macros que se
838asemejan a funciones puede ser nombradas en minúscula.
839
840Generalmente, las funciones en línea son preferibles a las macros que se
841asemejan a funciones.
842
843Las macros con varias instrucciones deben contenerse en un bloque do-while:
844
845.. code-block:: c
846
847	#define macrofun(a, b, c)			\
848		do {					\
849			if (a == 5)			\
850				haz_esto(b, c);		\
851		} while (0)
852
853Cosas a evitar al usar macros:
854
8551) macros que afectan el flujo de control:
856
857.. code-block:: c
858
859	#define FOO(x)					\
860		do {					\
861			if (blah(x) < 0)		\
862				return -EBUGGERED;	\
863		} while (0)
864
865es una **muy** mala idea. Parece una llamada de función pero sale de la
866función de ``llamada``; no rompa los analizadores internos de aquellos que
867leerán el código.
868
8692) macros que dependen de tener una variable local con un nombre mágico:
870
871.. code-block:: c
872
873	#define FOO(val) bar(index, val)
874
875puede parecer algo bueno, pero es confuso como el infierno cuando uno lee
876el código, y es propenso a romperse por cambios aparentemente inocentes.
877
8783) macros con argumentos que se usan como valores l: FOO(x) = y; le van
879a morder si alguien, por ejemplo, convierte FOO en una función en línea.
880
8814) olvidarse de la precedencia: las macros que definen constantes usando
882expresiones deben encerrar la expresión entre paréntesis. Tenga cuidado con
883problemas similares con macros usando parámetros.
884
885.. code-block:: c
886
887	#define CONSTANTE 0x4000
888	#define CONSTEXP (CONSTANTE | 3)
889
8905) colisiones de espacio de nombres ("namespace") al definir variables
891locales en macros que se asemejan a funciones:
892
893.. code-block:: c
894
895	#define FOO(x)				\
896	({					\
897		typeof(x) ret;			\
898		ret = calc_ret(x);		\
899		(ret);				\
900	})
901
902ret es un nombre común para una variable local -es menos probable que
903__foo_ret colisione (coincida) con una variable existente.
904
905El manual de cpp trata las macros de forma exhaustiva. El manual interno de
906gcc también cubre RTL, que se usa frecuentemente con lenguaje ensamblador
907en el kernel.
908
90913) Imprimir mensajes del kernel
910--------------------------------
911
912A los desarrolladores del kernel les gusta ser vistos como alfabetizados.
913Cuide la ortografía de los mensajes del kernel para causar una buena
914impresión. No utilice contracciones incorrectas como ``dont``; use
915``do not`` o ``don't`` en su lugar. Haga sus mensajes concisos, claros e
916inequívocos.
917
918Los mensajes del kernel no tienen que terminar con un punto.
919
920Imprimir números entre paréntesis (%d) no agrega valor y debe evitarse.
921
922Hay varias modelos de macros de diagnóstico de driver en <linux/dev_printk.h>
923que debe usar para asegurarse de que los mensajes coincidan con el
924dispositivo correcto y driver, y están etiquetados con el nivel correcto:
925dev_err(), dev_warn(), dev_info(), y así sucesivamente. Para mensajes que
926no están asociados con un dispositivo particular, <linux/printk.h> define
927pr_notice(), pr_info(), pr_warn(), pr_err(), etc.
928
929Crear buenos mensajes de depuración puede ser todo un desafío; y una vez
930los tiene, pueden ser de gran ayuda para la resolución remota de problemas.
931Sin embargo, la impresión de mensajes de depuración se maneja de manera
932diferente a la impresión de otros mensajes que no son de depuración.
933Mientras que las otras funciones pr_XXX() se imprimen incondicionalmente,
934pr_debug() no lo hace; se compila fuera por defecto, a menos que DEBUG sea
935definido o se establezca CONFIG_DYNAMIC_DEBUG. Eso es cierto para dev_dbg()
936también, y una convención relacionada usa VERBOSE_DEBUG para agregar
937mensajes dev_vdbg() a los ya habilitados por DEBUG.
938
939Muchos subsistemas tienen opciones de depuración de Kconfig para activar
940-DDEBUG en el Makefile correspondiente; en otros casos, los archivos
941usan #define DEBUG. Y cuando un mensaje de depuración debe imprimirse
942incondicionalmente, por ejemplo si es ya dentro de una sección #ifdef
943relacionada con la depuración, printk(KERN_DEBUG ...) puede ser usado.
944
94514) Reservando memoria
946----------------------
947
948El kernel proporciona los siguientes asignadores de memoria de propósito
949general: kmalloc(), kzalloc(), kmalloc_array(), kcalloc(), vmalloc() y
950vzalloc(). Consulte la documentación de la API para obtener más información.
951a cerca de ellos. :ref:`Documentation/core-api/memory-allocation.rst
952<memory_allocation>`
953
954La forma preferida para pasar el tamaño de una estructura es la siguiente:
955
956.. code-block:: c
957
958	p = kmalloc(sizeof(*p), ...);
959
960La forma alternativa donde se deletrea el nombre de la estructura perjudica
961la legibilidad, y presenta una oportunidad para un error cuando se cambia
962el tipo de variable de puntero, pero el tamaño correspondiente de eso que
963se pasa a un asignador de memoria no.
964
965Convertir el valor devuelto, que es un puntero vacío, es redundante. La
966conversión desde el puntero vacío a cualquier otro tipo de puntero está
967garantizado por la programación en idioma C.
968
969La forma preferida para asignar una matriz es la siguiente:
970
971.. code-block:: c
972
973	p = kmalloc_array(n, sizeof(...), ...);
974
975La forma preferida para asignar una matriz a cero es la siguiente:
976
977.. code-block:: c
978
979	p = kcalloc(n, sizeof(...), ...);
980
981Ambos casos verifican el desbordamiento en el tamaño de asignación n *
982sizeof (...), y devuelven NULL si esto ocurrió.
983
984Todas estas funciones de asignación genéricas emiten un volcado de pila
985(" stack dump") en caso de fallo cuando se usan sin __GFP_NOWARN, por lo
986que no sirve de nada emitir un mensaje de fallo adicional cuando se
987devuelva NULL.
988
98915) La enfermedad de inline
990----------------------------
991
992Parece haber una común percepción errónea de que gcc tiene una magica
993opción "hazme más rápido" de aceleración, llamada ``inline`` (en línea).
994Mientras que el uso de inlines puede ser apropiado (por ejemplo, como un
995medio para reemplazar macros, consulte el Capítulo 12), muy a menudo no lo
996es. El uso abundante de la palabra clave inline conduce a una mayor kernel,
997que a su vez ralentiza el sistema en su conjunto, debido a una mayor huella
998de icache para la CPU, y sencillamente porque hay menos memoria disponible
999para el pagecache. Solo piense en esto; un fallo en la memoria caché de la
1000página provoca una búsqueda de disco, que tarda fácilmente 5 milisegundos.
1001Hay MUCHOS ciclos de CPU que puede entrar en estos 5 milisegundos.
1002
1003Una razonable regla general es no poner funciones inline que tengan más de
10043 líneas de código en ellas. Una excepción a esta regla son los casos en
1005que se sabe que un parámetro es una constante en tiempo de compilación, y
1006como resultado de esto, usted *sabe*, el compilador podrá optimizar la
1007mayor parte de su función en tiempo de compilación. Para un buen ejemplo de
1008este último caso, véase la función en línea kmalloc().
1009
1010A menudo, la gente argumenta que agregar funciones en línea que son
1011estáticas y se usan solo una vez, es siempre una victoria ya que no hay
1012perdida de espacio. Mientras esto es técnicamente correcto, gcc es capaz de
1013incorporarlos automáticamente sin ayuda, y esta el problema de
1014mantenimiento de eliminar el inline, cuando un segundo usuario supera el
1015valor potencial de la pista que le dice a gcc que haga algo que habría
1016hecho de todos modos.
1017
101816) Valores devueltos por función y sus nombres
1019-----------------------------------------------
1020
1021Las funciones pueden devolver valores de muchos tipos diferentes, y uno de
1022lo más común es un valor que indica si la función tuvo éxito o ha fallado.
1023Dicho valor se puede representar como un número entero de código de error
1024(-Exxx = falla, 0 = éxito) o un booleano ``con éxito`` (0 = falla, distinto
1025de cero = éxito).
1026
1027La mezcla de estos dos tipos de representaciones es una fuente fértil de
1028errores difíciles de encontrar. Si el lenguaje C incluyera una fuerte
1029distinción entre enteros y booleanos, el compilador encontraría estos
1030errores por nosotros... pero no lo hace. Para ayudar a prevenir tales
1031errores, siga siempre esta convención::
1032
1033	Si el nombre de una función es una acción o un comando imperativo,
1034	la función debe devolver un número entero de código de error. si el nombre
1035	es un predicado, la función debe devolver un valor booleano "exitoso".
1036
1037Por ejemplo, ``agregar trabajo`` es un comando, y la función
1038agregar_trabajo() devuelve 0 en caso de éxito o -EBUSY en caso de fracaso.
1039De la misma manera, ``dispositivo PCI presente`` es un predicado, y la
1040función pci_dev_present() devuelve 1 si tiene éxito en encontrar un
1041dispositivo coincidente o 0 si no es así.
1042
1043Todas las funciones EXPORTed (exportadas) deben respetar esta convención,
1044al igual que todas las funciones publicas. Las funciones privadas
1045(estáticas) no lo necesitan, pero es recomendado que lo hagan.
1046
1047Las funciones cuyo valor devuelto es el resultado real de un cálculo, en
1048lugar de una indicación de si el cómputo tuvo éxito, no están sujetas a
1049esta regla. Generalmente indican fallo al devolver valores fuera del rango
1050de resultados. Los ejemplos típicos serían funciones que devuelven
1051punteros; estos usan NULL o el mecanismo ERR_PTR para informar de fallos.
1052
105317) Usando bool
1054----------------
1055
1056El tipo bool del kernel Linux es un alias para el tipo C99 _Bool. Los
1057valores booleanos pueden solo evaluar a 0 o 1, y la conversión implícita o
1058explícita a bool convierte automáticamente el valor en verdadero o falso.
1059Cuando se utilizan tipos booleanos,
1060!! no se necesita construcción, lo que elimina una clase de errores.
1061
1062Cuando se trabaja con valores booleanos, se deben usar las definiciones
1063verdadera y falsa, en lugar de 1 y 0.
1064
1065Los tipos de devolución de función bool y las variables de pila siempre
1066se pueden usar cuando esto sea adecuado. Se recomienda el uso de bool para
1067mejorar la legibilidad y, a menudo, es una mejor opción que 'int' para
1068almacenar valores booleanos.
1069
1070No use bool si el diseño de la línea de caché o el tamaño del valor son
1071importantes, ya que su tamaño y la alineación varía según la arquitectura
1072compilada. Las estructuras que son optimizadas para la alineación y el
1073tamaño no debe usar bool.
1074
1075Si una estructura tiene muchos valores verdadero/falso, considere
1076consolidarlos en un bitfield con miembros de 1 bit, o usando un tipo de
1077ancho fijo apropiado, como u8.
1078
1079De manera similar, para los argumentos de función, se pueden consolidar
1080muchos valores verdaderos/falsos en un solo argumento bit a bit 'flags' y
1081'flags' a menudo, puede ser una alternativa de argumento más legible si los
1082sitios de llamada tienen constantes desnudas de tipo verdaderas/falsas.
1083
1084De lo contrario, el uso limitado de bool en estructuras y argumentos puede
1085mejorar la legibilidad.
1086
108718) No reinvente las macros del kernel
1088---------------------------------------
1089
1090El archivo de cabecera include/linux/kernel.h contiene una serie de macros
1091que debe usar, en lugar de programar explícitamente alguna variante de
1092estos por usted mismo. Por ejemplo, si necesita calcular la longitud de una
1093matriz, aproveche la macro
1094
1095.. code-block:: c
1096
1097	#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
1098
1099De manera similar, si necesita calcular el tamaño de algún miembro de la
1100estructura, use
1101
1102.. code-block:: c
1103
1104	#define sizeof_field(t, f) (sizeof(((t*)0)->f))
1105
1106También hay macros min() y max() que realizan una verificación estricta de
1107tipos si lo necesita. Siéntase libre de leer detenidamente ese archivo de
1108encabezado para ver qué más ya está definido y que no debe reproducir en su
1109código.
1110
111119) Editores modeline y otros desastres
1112---------------------------------------
1113
1114Algunos editores pueden interpretar la información de configuración
1115incrustada en los archivos fuente, indicado con marcadores especiales. Por
1116ejemplo, emacs interpreta las líneas marcadas como esto:
1117
1118.. code-block:: c
1119
1120	-*- mode: c -*-
1121
1122O así:
1123
1124.. code-block:: c
1125
1126	/*
1127	Local Variables:
1128	compile-command: "gcc -DMAGIC_DEBUG_FLAG foo.c"
1129	End:
1130	*/
1131
1132Vim interpreta los marcadores que se ven así:
1133
1134.. code-block:: c
1135
1136	/* vim:set sw=8 noet */
1137
1138No incluya ninguno de estos en los archivos fuente. La gente tiene sus
1139propias configuraciones del editor, y sus archivos de origen no deben
1140anularlos. Esto incluye marcadores para sangría y configuración de modo.
1141La gente puede usar su propio modo personalizado, o puede tener algún otro
1142método mágico para que la sangría funcione correctamente.
1143
1144
114520) Ensamblador inline
1146-----------------------
1147
1148En el código específico de arquitectura, es posible que deba usar
1149ensamblador en línea para interactuar con funcionalidades de CPU o
1150plataforma. No dude en hacerlo cuando sea necesario. Sin embargo, no use
1151ensamblador en línea de forma gratuita cuando C puede hacer el trabajo.
1152Puede y debe empujar el hardware desde C cuando sea posible.
1153
1154Considere escribir funciones auxiliares simples que envuelvan bits comunes
1155de ensamblador, en lugar de escribirlos repetidamente con ligeras
1156variaciones. Recuerde que el ensamblador en línea puede usar parámetros C.
1157
1158Las funciones de ensamblador grandes y no triviales deben ir en archivos .S,
1159con su correspondientes prototipos de C definidos en archivos de encabezado
1160en C. Los prototipos de C para el ensamblador deben usar ``asmlinkage``.
1161
1162Es posible que deba marcar su declaración asm como volátil, para evitar que
1163GCC la elimine si GCC no nota ningún efecto secundario. No siempre es
1164necesario hacerlo, sin embargo, y hacerlo innecesariamente puede limitar la
1165optimización.
1166
1167Al escribir una sola declaración de ensamblador en línea que contiene
1168múltiples instrucciones, ponga cada instrucción en una línea separada en
1169una string separada, y termine cada string excepto la última con ``\n\t``
1170para indentar correctamente la siguiente instrucción en la salida en
1171ensamblador:
1172
1173.. code-block:: c
1174
1175	asm ("magic %reg1, #42\n\t"
1176	     "more_magic %reg2, %reg3"
1177	     : /* outputs */ : /* inputs */ : /* clobbers */);
1178
117921) Compilación condicional
1180---------------------------
1181
1182Siempre que sea posible, no use condicionales de preprocesador (#if,
1183#ifdef) en archivos .c; de lo contrario, el código es más difícil de leer y
1184la lógica más difícil de seguir. En cambio, use dichos condicionales en un
1185archivo de encabezado que defina funciones para usar en esos archivos .c,
1186proporcionando versiones de código auxiliar sin operación en el caso #else,
1187y luego llame a estas funciones incondicionalmente desde archivos .c. El
1188compilador evitará generar cualquier código para las llamadas restantes,
1189produciendo resultados idénticos, pero la lógica es fácil de seguir.
1190
1191Prefiera compilar funciones completas, en lugar de porciones de funciones o
1192porciones de expresiones. En lugar de poner un ifdef en una expresión,
1193divida la totalidad de la expresión con una función de ayuda independiente
1194y aplique el condicional a esa función.
1195
1196Si tiene una función o variable que puede potencialmente quedar sin usar en
1197una configuración en particular, y el compilador advertiría sobre su
1198definición sin usar, marque la definición como __maybe_unused en lugar de
1199envolverla en un preprocesador condicional. (Sin embargo, si una función o
1200variable *siempre* acaba sin ser usada, bórrela.)
1201
1202Dentro del código, cuando sea posible, use la macro IS_ENABLED para
1203convertir un símbolo Kconfig en una expresión booleana de C, y utilícelo en
1204un condicional de C normal:
1205
1206.. code-block:: c
1207
1208	if (IS_ENABLED(CONFIG_SOMETHING)) {
1209		...
1210	}
1211
1212El compilador "doblará"" constantemente el condicional e incluirá o
1213excluirá el bloque de código al igual que con un #ifdef, por lo que esto no
1214agregará ningún tiempo de gastos generales en ejecución. Sin embargo, este
1215enfoque todavía permite que el compilador de C vea el código dentro del
1216bloque, y verifique que sea correcto (sintaxis, tipos, símbolo, referencias,
1217etc.). Por lo tanto, aún debe usar un #ifdef si el código dentro del bloque
1218hace referencia a símbolos que no existirán si no se cumple la condición.
1219
1220Al final de cualquier bloque #if o #ifdef no trivial (más de unas pocas
1221líneas), incluya un comentario después de #endif en la misma línea,
1222anotando la expresión condicional utilizada. Por ejemplo:
1223
1224.. code-block:: c
1225
1226	#ifdef CONFIG_SOMETHING
1227	...
1228	#endif /* CONFIG_SOMETHING */
1229
123022) No rompa el kernel
1231-----------------------
1232
1233En general, la decisión de romper el kernel pertenece al usuario, más que
1234al desarrollador del kernel.
1235
1236Evite el panic()
1237****************
1238
1239panic() debe usarse con cuidado y principalmente solo durante el arranque
1240del sistema. panic() es, por ejemplo, aceptable cuando se queda sin memoria
1241durante el arranque y no puede continuar.
1242
1243Use WARN() en lugar de BUG()
1244****************************
1245
1246No agregue código nuevo que use cualquiera de las variantes BUG(), como
1247BUG(), BUG_ON() o VM_BUG_ON(). En su lugar, use una variante WARN*(),
1248preferiblemente WARN_ON_ONCE(), y posiblemente con código de recuperación.
1249El código de recuperación no es requerido si no hay una forma razonable de
1250recuperar, al menos parcialmente.
1251
1252"Soy demasiado perezoso para tener en cuenta los errores" no es una excusa
1253para usar BUG(). Importantes corrupciones internas sin forma de continuar
1254aún pueden usar BUG(), pero necesitan una buena justificación.
1255
1256Use WARN_ON_ONCE() en lugar de WARN() o WARN_ON()
1257*************************************************
1258
1259Generalmente, se prefiere WARN_ON_ONCE() a WARN() o WARN_ON(), porque es
1260común que una condición de advertencia dada, si ocurre, ocurra varias
1261veces. Esto puede llenar el registro del kernel, e incluso puede ralentizar
1262el sistema lo suficiente como para que el registro excesivo se convierta en
1263su propio, adicional problema.
1264
1265No haga WARN a la ligera
1266************************
1267
1268WARN*() está diseñado para situaciones inesperadas que nunca deberían
1269suceder. Las macros WARN*() no deben usarse para nada que se espera que
1270suceda durante un funcionamiento normal. No hay "checkeos" previos o
1271posteriores a la condición, por ejemplo. De nuevo: WARN*() no debe usarse
1272para una condición esperada que vaya a activarse fácilmente, por ejemplo,
1273mediante acciones en el espacio del usuario. pr_warn_once() es una
1274alternativa posible, si necesita notificar al usuario de un problema.
1275
1276No se preocupe sobre panic_on_warn de usuarios
1277**********************************************
1278
1279Algunas palabras más sobre panic_on_warn: Recuerde que ``panic_on_warn`` es
1280una opción disponible del kernel, y que muchos usuarios configuran esta
1281opción. Esta es la razón por la que hay un artículo de "No haga WARN a la
1282ligera", arriba. Sin embargo, la existencia de panic_on_warn de usuarios no
1283es una razón válida para evitar el uso juicioso de WARN*(). Esto se debe a
1284que quien habilita panic_on_warn, explícitamente pidió al kernel que
1285fallara si se dispara un WARN*(), y tales usuarios deben estar preparados
1286para afrontar las consecuencias de un sistema que es algo más probable que
1287se rompa.
1288
1289Use BUILD_BUG_ON() para aserciones en tiempo de compilación
1290***********************************************************
1291
1292El uso de BUILD_BUG_ON() es aceptable y recomendado, porque es una aserción
1293en tiempo de compilación, que no tiene efecto en tiempo de ejecución.
1294
1295Apéndice I) Referencias
1296-----------------------
1297
1298The C Programming Language, Segunda edicion
1299por Brian W. Kernighan and Dennis M. Ritchie.
1300Prentice Hall, Inc., 1988.
1301ISBN 0-13-110362-8 (paperback), 0-13-110370-9 (hardback).
1302
1303The Practice of Programming
1304por Brian W. Kernighan and Rob Pike.
1305Addison-Wesley, Inc., 1999.
1306ISBN 0-201-61586-X.
1307
1308manuales GCC - en cumplimiento con K&R y este texto - para cpp, gcc,
1309detalles de gcc y sangría, todo disponible en https://www.gnu.org/manual/
1310
1311WG14 es el grupo de trabajo de estandarización internacional de la
1312programación en lenguaje C, URL: http://www.open-std.org/JTC1/SC22/WG14/
1313
1314:ref:`process/coding-style.rst <codingstyle>` del kernel, por greg@kroah.com at OLS 2002:
1315http://www.kroah.com/linux/talks/ols_2002_kernel_codingstyle_talk/html/
1316