/ / Usando aserción en el kernel de Linux - linux, linux-kernel, assert, asertions, assertion

Usando aserción en el kernel de Linux - linux, linux-kernel, aseverar, aserciones, aserción

Tengo una pregunta sobre assert() En Linux: ¿Puedo usarlo en el kernel?

Si no, ¿qué técnicas usas habitualmente si, por ejemplo, no quiero ingresar el puntero NULO?

Respuestas

40 para la respuesta № 1

Las macros de kernel correspondientes son BUG_ON y WARN_ON. El primero es para cuando se desea que el kernel entre en pánico y desactive el sistema (es decir, un error irrecuperable). Este último es para cuando desea registrar algo en el registro del kernel (visible a través de dmesg)

Como dice @Michael, en el kernel, necesita validar cualquier cosa que provenga del espacio de usuario y solo manejarlo, lo que sea que es. BUG_ON y WARN_ON son para detectar errores en su propio código o problemas con el hardware.


7 para la respuesta № 2

Una opción sería utilizar la macro. BUG_ON(). Va a printk un mensaje, y luego panic() (es decir, colapsa) el kernel.

http://kernelnewbies.org/KernelHacking-HOWTO/Debugging_Kernel

Por supuesto, esto solo debe usarse como una estrategia de manejo de errores de último recurso (al igual que assert) ...


5 para la respuesta № 3

No. A menos que esté trabajando en el núcleo del núcleo y más bien en un módulo, debe hacer todo lo posible para no fallar nunca (técnicamente, abort()) el núcleo. Si no desea utilizar un puntero NULL, simplemente no lo hagas. Verifíquelo antes de usarlo y genere un registro de errores si lo es.

Lo mas cercano a ti podría querer hacer si realmente estás manejando un caso fatal es el panic() función o la BUG_ON y WARN_ON Las macros, que abortarán la ejecución y producirán mensajes de diagnóstico, un seguimiento de la pila y una lista de módulos.


4 para la respuesta № 4

Bueno, al quitar la referencia al puntero nulo se producirá un error, que puede utilizar para encontrar el código ofensivo. Ahora, si desea afirmar () una condición dada, puede usar

BUG_ON(condition)

Un mecanismo menos letal es WARN_ON, que producirá un retroceso sin que el núcleo se caiga.


0 para la respuesta № 5

BUG_ON() Es el enfoque apropiado para hacerlo. Comprueba si la condición es verdadera y llama a la macro BUG().

Cómo BUG() Maneja el resto se explica muy bien en el siguiente artículo:

http://kernelnewbies.org/FAQ/BUG


0 para la respuesta № 6

Utilizo esta macro, usa BUG () pero agrega más información que normalmente uso para la depuración, y por supuesto puede editarla para incluir más información si lo desea:

#define ASSERT(x)                                                       
do {    if (x) break;                                                   
printk(KERN_EMERG "### ASSERTION FAILED %s: %s: %d: %sn",      
__FILE__, __func__, __LINE__, #x); dump_stack(); BUG();  
} while (0)