/ / Verwendung von Assertion im Linux-Kernel - Linux, Linux-Kernel, Assert, Assertions, Assertion

Assertion im Linux-Kernel verwenden - Linux, Linux-Kernel, Assertion, Assertions, Assertion

ich habe eine Frage über assert() unter Linux: kann ich es im Kernel verwenden?

Wenn nein, welche Techniken verwenden Sie normalerweise, wenn Sie zum Beispiel keinen NULL-Zeiger eingeben möchten?

Antworten:

40 für die Antwort № 1

Die entsprechenden Kernel-Makros sind BUG_ON und WARN_ON. Ersteres gilt für den Fall, dass Sie den Kernel in Panik versetzen und das System herunterfahren möchten (d. H. Nicht behebbarer Fehler). Letzteres ist für den Fall gedacht, dass Sie etwas in das Kernel - Protokoll eintragen möchten (einsehbar über dmesg).

Wie @Michael sagt, müssen Sie im Kernel alles validieren, was aus dem Benutzerbereich stammt handle es, was auch immer es ist. BUG_ON und WARN_ON sollen Fehler in Ihrem eigenen Code oder Probleme mit der Hardware erkennen.


7 für die Antwort № 2

Eine Möglichkeit wäre die Verwendung des Makros BUG_ON(). Es wird printk eine Nachricht und dann panic() (d. h. Absturz) des Kernels.

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

Dies sollte natürlich nur als Fehlerbehandlungsstrategie der letzten Instanz verwendet werden (genau wie assert) ...


5 für die Antwort № 3

Nein. Sofern Sie nicht am Kernelkern und eher an einem Modul arbeiten, sollten Sie Ihr Bestes geben, um niemals einen Absturz zu verursachen (technisch gesehen, abort()) der Kernel. Wenn Sie keinen NULL - Zeiger verwenden möchten, verwenden Sie einfach tu es nicht. Überprüfen Sie es, bevor Sie es verwenden, und erstellen Sie gegebenenfalls ein Fehlerprotokoll.

Das nächste, was Sie Macht wollen, wenn Sie tatsächlich einen tödlichen Fall behandeln, ist die panic() Funktion oder die BUG_ON und WARN_ON Makros, die die Ausführung abbrechen und Diagnosemeldungen, einen Stack-Trace und eine Liste von Modulen erzeugen.


4 für die Antwort № 4

Wenn Sie den Nullzeiger dereferenzieren, wird ein Hoppla ausgegeben, mit dem Sie den fehlerhaften Code finden können. Wenn Sie nun eine gegebene Bedingung bestätigen möchten, können Sie verwenden

BUG_ON(condition)

Ein weniger tödlicher Mechanismus ist WARN_ON, der einen Backtrace erzeugt, ohne den Kernel zum Absturz zu bringen.


0 für die Antwort № 5

BUG_ON() ist der geeignete Ansatz, um es zu tun. Es prüft, ob die Bedingung erfüllt ist und ruft das Makro auf BUG().

Wie BUG() behandelt den Rest ist sehr gut im folgenden Artikel erklärt:

http://kernelnewbies.org/FAQ/BUG


0 für die Antwort № 6

Ich benutze dieses Makro, es benutzt BUG (), fügt aber weitere Informationen hinzu, die ich normalerweise zum Debuggen verwende, und natürlich können Sie es bearbeiten, um weitere Informationen aufzunehmen, wenn Sie dies wünschen:

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