/ / Usando assertion nel kernel Linux - linux, linux-kernel, assert, assertion, assertion

Usando l'asserzione nel kernel Linux - linux, linux-kernel, assertion, assertion, assertion

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?

risposte:

40 per risposta № 1

Le macro del kernel corrispondenti sono BUG_ON e WARN_ON. Il primo è per quando si vuole fare il panico del kernel e portare il sistema al minimo (cioè, errore irreversibile). Quest'ultimo è per quando si desidera registrare qualcosa nel registro del kernel (visualizzabile tramite dmesg).

Come dice @Michael, nel kernel, devi convalidare qualsiasi cosa provenga da userspace e just occupatene, qualunque cosa sia. BUG_ON e WARN_ON sono per catturare bug nel tuo codice o problemi con l'hardware.


7 per risposta № 2

Un'opzione sarebbe usare la macro BUG_ON(). Lo farà printk un messaggio, e poi panic() (es. crash) il kernel.

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

Naturalmente, questo dovrebbe essere usato solo come strategia di gestione degli errori di ultima istanza (proprio come assert) ...


5 per risposta № 3

No. A meno che tu non stia lavorando sul core del kernel e piuttosto su un modulo, dovresti fare del tuo meglio per non andare in crash (tecnicamente, abort()) il kernel. Se non vuoi usare un puntatore NULL, semplicemente non farlo. Controllalo prima di usarlo e produci un log degli errori, se lo è.

La cosa più vicina a te potrebbe voglio fare se stai effettivamente gestendo un caso fatale è il panic() funzione o il BUG_ON e WARN_ON macro, che interrompono l'esecuzione e producono messaggi diagnostici, una traccia stack e un elenco di moduli.


4 per risposta № 4

Bene, il dereferenziamento del puntatore nullo produrrà un oops, che è possibile utilizzare per trovare il codice offendente. Ora, se vuoi affermare () una data condizione, puoi usare

BUG_ON(condition)

Un meccanismo meno letale è WARN_ON, che produrrà un backtrace senza arrestare il kernel.


0 per risposta № 5

BUG_ON() è l'approccio appropriato per farlo. Verifica che la condizione sia vera e chiama la macro BUG().

Come BUG() gestisce il resto è spiegato molto bene nel seguente articolo:

http://kernelnewbies.org/FAQ/BUG


0 per risposta № 6

Io uso questa macro, usa BUG () ma aggiunge qualche altra informazione che normalmente uso per il debug, e ovviamente puoi modificarla per includere più informazioni se lo desideri:

#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)