Usando l'asserzione nel kernel Linux
-
28-10-2019 - |
Domanda
Ho una domanda su assert()
In Linux: posso usarlo nel kernel?
Se no, quali tecniche usi di solito se, ad esempio, non voglio inserire il puntatore null?
Soluzione
Le macro del kernel corrispondenti sono BUG_ON
e WARN_ON
. Il primo è per quando vuoi fare il panico del kernel e abbattere il sistema (cioè un errore irrecuperabile). Quest'ultimo è per quando si desidera registrare qualcosa al registro del kernel (visualizzabile via dmesg
).
Come dice @michael, nel kernel, devi convalidare tutto ciò che proviene dallo spazio degli utenti e giusto occupatene, qualunque cosa sia. BUG_ON e WARN_ON devono catturare bug nel tuo codice o problemi con l'hardware.
Altri suggerimenti
Un'opzione sarebbe quella di utilizzare la macro BUG_ON()
. Lo farà printk
un messaggio e poi panic()
(IE Crash) Il kernel.
http://kernelnewbies.org/kernelhacking-howto/debugging_kernel
Naturalmente, questo dovrebbe essere usato solo come strategia di gestione degli errori dell'ultima risorsa (proprio come assert
)...
No. A meno che tu non stia lavorando al core del kernel e piuttosto su un modulo, dovresti fare del tuo meglio per non schiantarsi mai (tecnicamente, abort()
) il nocciolo. Se non vuoi usare un puntatore nullo, solo Non farlo. Controllalo prima di usarlo e produrre un registro degli errori se lo è.
La cosa più vicina tu potrebbe voglio fare se stai effettivamente gestendo una custodia fatale è il panic()
funzione o la BUG_ON
e WARN_ON
Macro, che interromperanno l'esecuzione e produceranno messaggi diagnostici, una traccia di stack e un elenco di moduli.
Bene, il dereferencing null puntatore produrrà un OOPS, che puoi usare per trovare il codice offensivo. Ora, se si desidera asserire () una determinata condizione, puoi usare
BUG_ON(condition)
Un meccanismo meno letale è Warn_on, che produrrà un backtrace senza schiantarsi il kernel.
BUG_ON()
è l'approccio appropriato per farlo. Verifica che la condizione sia vera e chiama la macro BUG()
.
Come BUG()
Geste il resto è spiegato molto bene nel seguente articolo:
Uso questa macro, utilizza bug () ma aggiunge ulteriori informazioni che normalmente utilizzo per il debug e, naturalmente, puoi modificarlo per includere maggiori informazioni se lo desideri:
#define ASSERT(x) \
do { if (x) break; \
printk(KERN_EMERG "### ASSERTION FAILED %s: %s: %d: %s\n", \
__FILE__, __func__, __LINE__, #x); dump_stack(); BUG(); \
} while (0)