Sparse es una herramienta de software diseñada para encontrar posibles fallos de codificación en el kernel de Linux . [ 2 ] A diferencia de otras herramientas similares , esta herramienta de análisis estático fue diseñada inicialmente para señalar solo construcciones que probablemente fueran de interés para los desarrolladores del kernel , como la mezcla de punteros a espacios de direcciones de usuario y del kernel .
Las comprobaciones espaciadas detectan problemas conocidos y permiten al desarrollador incluir anotaciones en el código que transmiten información sobre los tipos de datos , como el espacio de direcciones al que apuntan los punteros y los bloqueos que adquiere o libera una función.
Linus Torvalds comenzó a escribir Sparse en 2003. Josh Triplett fue su mantenedor desde 2006, un rol que asumió Christopher Li en 2009 [ 3 ] y Luc Van Oostenryck en noviembre de 2018. [ 4 ] Sparse se publica bajo la Licencia MIT .
Anotaciones
Algunas de las comprobaciones realizadas por Sparse requieren anotar el código fuente utilizando la extensión __attribute__GCC o el __context__especificador específico de Sparse. [ 5 ] Sparse define la siguiente lista de atributos:
address_space(num)bitwiseforcecontext(expression,in_context,out_context)
Cuando una API se define con una macro, el especificador puede ser reemplazado por .__attribute__((context(...)))__context__(...)
definiciones del kernel de Linux
El kernel de Linux define las siguientes formas abreviadas como macros de preprocesador en los archivos linux/compiler.h y linux/types.h (cuando se compila sin la __CHECKER__bandera, todas estas anotaciones se eliminan del código):
#ifdef __CHECKER__ # define __user __attribute__((noderef, address_space(1))) # define __kernel __attribute__((address_space(0))) # define __safe __attribute__((safe)) # define __force __attribute__((force)) # define __nocast __attribute__((nocast)) # define __iomem __attribute__((noderef, address_space(2))) # define __must_hold(x) __attribute__((context(x,1,1))) # define __acquires(x) __attribute__((context(x,0,1))) # define __releases(x) __attribute__((context(x,1,0))) # define __acquire(x) __context__(x,1) # define __release(x) __context__(x,-1) # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) # define __percpu __attribute__((noderef, address_space(3))) #ifdef CONFIG_SPARSE_RCU_POINTER # define __rcu __attribute__((noderef, address_space(4))) #else # define __rcu #endif extern void __chk_user_ptr ( const volatile void __user * ); extern void __chk_io_ptr ( const volatile void __iomem * ); #else # define __user # define __kernel # define __safe # define __force # define __nocast # define __iomem # define __chk_user_ptr(x) (void)0 # define __chk_io_ptr(x) (void)0 # define __builtin_warning(x, y...) (1) # define __must_hold(x) # define __acquires(x) # define __releases(x) # define __acquire(x) (void)0 # define __release(x) (void)0 # define __cond_lock(x,c) (c) # define __percpu # define __rcu #endif#ifdef __CHECKER__ # define __bitwise __attribute__((bitwise)) #else # define __bitwise #endifEjemplos
Los tipos __le32y __be32representan tipos enteros de 32 bits con diferente orden de bytes . Sin embargo, el lenguaje C no permite especificar que las variables de estos tipos no se deben mezclar. El bitwiseatributo se utiliza para marcar estos tipos como restringidos, por lo que Sparse emitirá una advertencia si se mezclan variables de estos tipos u otras variables enteras:
typedef __u32 __bitwise __le32 ; typedef __u32 __bitwise __be32 ;Para marcar las conversiones válidas entre tipos restringidos, forcese utiliza una conversión con el atributo para evitar que Sparse muestre una advertencia.
Véase también
Referencias
- ↑ Luc Van Oostenryck (6 de septiembre de 2021). "Escaso 0.6.4" . linux-sparse@vger.kernel.org (lista de correo) . Consultado el 8 de mayo de 2024 .
- ↑ Yoann Padioleau; René Rydhof Hansen; Julia L. Lawall ; Gilles Muller (2006). Parches semánticos para documentar y automatizar evoluciones colaterales en controladores de dispositivos Linux . Actas del 3er taller sobre lenguajes de programación y sistemas operativos: soporte lingüístico para sistemas operativos modernos. CiteSeerX 10.1.1.122.7080 . doi : 10.1145/1215995.1216005 . ISBN 1-59593-577-0
La comunidad Linux ha comenzado recientemente a utilizar diversas herramientas para analizar mejor el código C. Sparse es una biblioteca que, al igual que un front-end del compilador, proporciona un acceso sencillo al árbol de sintaxis abstracta y a la información de tipado de un programa
C. - ↑ Christopher Li (16-10-2009). "Sparse 0.4.2 lanzado" . linux-sparse (Lista de correo) . Consultado el 6-11-2010 .
- ↑ cambiar el responsable del mantenimiento de Sparse , consultado el 10 de diciembre de 2018
- ↑ "Sintaxis de atributos : uso de la colección de compiladores GNU (GCC)" . Free Software Foundation . Consultado el 13 de noviembre de 2010 .
Lecturas adicionales
- Neil Brown (8 de junio de 2016). "Sparse: una mirada bajo el capó" . LWN.net . Consultado el 26 de noviembre de 2021 .
- Jonathan Corbet (1 de junio de 2004). "Detección automática de problemas en el kernel" . LWN.net . Consultado el 26 de noviembre de 2021 .
- Doc Searls (24 de noviembre de 2003). "Linus y los lunáticos, parte I" . Linux Journal . Recuperado el 26 de noviembre de 2021 .
- Subrata Modak; Balbir Singh; Yamato Masatake (2009). Poniendo a prueba LTP: Validación del kernel de Linux y casos de prueba (PDF) . Simposio Linux de Ottawa 2009. págs. 209–220 . Recuperado el 26 de noviembre de 2021 .
- Daniel De Graaf (2010). Detección de defectos estáticos en conjuntos de cambios (PDF) (tesis de maestría). Ames, Iowa: Universidad Estatal de Iowa. OCLC 665146513. Recuperado el 7 de noviembre de 2010 .
Enlaces externos
- Documentación oficial
- Uso de `sparse` para la verificación de tipos , Documentación del kernel de Linux
- Analizador semántico para C – Manual de usuario de Linux – Comandos de usuario
- : Envoltorio del compilador para ejecutar Sparse después de la compilación – Manual de usuario de Linux – Comandos de usuario
- Herramientas de análisis estático de programas
- Herramientas gratuitas para probar software
- Software que utiliza la licencia MIT.