checkpatch y las herramientas de revisión
Antes de que un humano vea tu código, hazlo pasar por las herramientas: checkpatch.pl para el estilo, sparse y smatch para bugs. Automatiza la calidad que el kernel exige.
El kernel tiene estándares altísimos y un proceso de revisión exigente. La buena noticia: mucha de esa exigencia está automatizada. Antes de que un mantenedor gaste su tiempo en tu parche, pásalo por las herramientas — encontrarán los problemas de estilo y muchos bugs por ti.
- checkpatch.pl: el verificador de estilo.
- sparse: el analizador semántico del kernel.
- smatch y Coccinelle.
- Integrarlo en tu flujo.
checkpatch.pl
El kernel trae un script que verifica que tu código (o tu parche) cumple el estilo y detecta errores comunes:
# sobre un archivo
scripts/checkpatch.pl --file drivers/midriver/midriver.c
# sobre un parche (lo normal antes de enviarlo)
scripts/checkpatch.pl mi-parche.patch
Reporta errores (que debes arreglar) y avisos (que casi siempre debes arreglar): tabs mal, líneas largas, llaves, espacios, y patrones peligrosos. Pasar checkpatch limpio es el mínimo antes de enviar un parche; los mantenedores rechazan de plano lo que no lo cumple.
sparse: el analizador del kernel
sparse es un analizador estático hecho para el kernel. Entiende anotaciones especiales del kernel (__user, __iomem, __rcu) que marcan la naturaleza de los punteros, y detecta errores que el compilador normal no ve:
make C=1 drivers/midriver/ # compila con sparse activado
Aquí hay una lección profunda de ingeniería. Un char * de userspace y un char * de kernelspace son, para C, el mismo tipo — pero mezclarlos es un bug de seguridad grave (nivel 12). El kernel resuelve esto con anotaciones: marca los punteros de usuario como __user, la memoria de dispositivos como __iomem, los datos protegidos por RCU como __rcu. El compilador las ignora, pero sparse las comprueba: si desreferencias un puntero __user directamente, o pasas memoria de kernel donde se espera de usuario, sparse lo caza. Es hacer visible al análisis una distinción que el sistema de tipos de C no captura por sí solo. Correr sparse (make C=1) sobre tu código atrapa una clase entera de bugs de la frontera usuario/kernel antes de que existan. Es la respuesta del kernel a las limitaciones de tipado de C, y una razón por la que su código, pese a estar en C, es tan robusto.
smatch y Coccinelle
smatch
Analizador estático más profundo que sparse: sigue el flujo del código y encuentra fugas, dereferencias nulas condicionales, y errores lógicos.
Coccinelle
Busca y transforma patrones en el código a gran escala (parches semánticos). Se usa para arreglos masivos coherentes en todo el kernel.
La regla de oro del contribuidor: nunca hagas perder el tiempo a un revisor con algo que una herramienta habría cazado. Antes de enviar un parche, pásalo por checkpatch (estilo), compila con sparse (make C=1) y, si puedes, smatch. Arregla todo lo que reporten. Esto respeta el tiempo de los mantenedores (voluntarios y muy ocupados), aumenta tus probabilidades de que acepten tu parche, y te enseña los estándares por repetición. La calidad automatizada es la cortesía básica del proceso del kernel (nivel 30).
- Pasa
scripts/checkpatch.pl --filesobre tu módulo y arregla lo que reporte. - Compila con
make C=1(sparse) y observa si detecta algo. - Investiga las anotaciones
__user,__iomem,__rcuen el código del kernel. - Deja tu módulo pasando checkpatch y sparse limpios.