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