這樣的漏洞看起來太瑣碎了,我認爲靜態代碼分析工具應該能夠找到它們。是否有任何可以捕獲此內存泄漏的靜態代碼分析器?
Ex1:
void foo(void) {
u32 *ptr = kmalloc(512, GFP_KERNEL);
ptr = (u32 *)0xffffffff;
kfree(ptr);
}
我知道Coverity
可以如下找到泄漏,但不知道上面的一個:任何人都可以請讓我知道這是否會在任何Coverity
或工具,如Sparse
獲得被檢測的?
Ex2:
void foo(void) {
kmalloc(512, GFP_KERNEL);
}
Ex3:
void foo(void) {
void * ptr = kmalloc(512, GFP_KERNEL);
if (true)
return;
kfree(ptr)
}
你的例子很簡單。有兩個大頭釘。 Coverity和其他人試圖動態確定一個函數的功能。其他一些工具(如Sparse,splint等)需要註釋來捕獲額外的含義(超出語言範圍)。可以編寫[** Coccinelle **](http://coccinelle.lip6.fr/)來檢測規則。這些工具可能具有內置的意義。 [gcc __attribute()](https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html),例如* format *,* malloc *,* nonnull *可能是或者是* annotations *的示例。 – 2015-02-10 19:16:09
內核中還有一個泄漏檢測器,它會給出分配調用者的回溯;作爲實際在內核空間工作的'Valgrind'的一個例子。上述任何工具*都可能*可能檢測到錯誤。有時很難解析代碼;特別是內聯彙編程序。 – 2015-02-10 19:18:00
你能否請解釋一下,Covery/Sparse如何檢測這個內存泄漏?我對「稀疏」知道一點,它可以警告我們以下消息: 'u32 * ptr = kmalloc(512,GFP_KERNEL); '它會報告'不正確的類型分配警告'。但是對於這個'ptr =(u32 *)0xffffffff;'不會報告任何警告,因爲類型轉換會消除警告。那麼'Sparse'如何檢測這個內存泄漏? 如果我錯了,請糾正我。 – 2015-02-11 06:17:47