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 № 1Le 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)