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?

È stato utile?

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:

http://kernelnewbies.org/faq/bug

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top