亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

內核工具 – Sparse 簡介

2024-06-28 13:27:43
字體:
來源:轉載
供稿:網友
內核工具 – Sparse 簡介

Sparse是內核代碼靜態分析工具, 能夠幫助我們找出代碼中的隱患.

主要內容:

  • Sparse 介紹
  • Sparse 使用方法
  • Sparse 在編譯內核中的使用
  • 補充

1. Sparse 介紹

Sparse 誕生于 2004 年, 是由linux之父開發的, 目的就是提供一個靜態檢查代碼的工具, 從而減少linux內核的隱患.

其實在Sparse之前, 已經有了一個不錯的代碼靜態檢查工具("SWAT"), 只不過這個工具不是免費軟件, 使用上有一些限制.

所以 linus 還是自己開發了一個靜態檢查工具.

具體可以參考這篇文章(2004年的文章了): Finding kernel PRoblems automatically

Sparse相關的資料非常少, 關于它的使用方法我也是網上查找+自己實驗得出來的.

內核代碼中還有一個簡略的關于 Sparse的說明文件: Documentation/sparse.txt

Sparse通過 gcc 的擴展屬性 __attribute__ 以及自己定義的 __context__ 來對代碼進行靜態檢查.

這些屬性如下(盡量整理的,可能還有些不全的地方):

宏名稱

宏定義

檢查點

__bitwise__attribute__((bitwise))確保變量是相同的位方式(比如 bit-endian, little-endiandeng)
__user__attribute__((noderef, address_space(1)))指針地址必須在用戶地址空間
__kernel__attribute__((noderef, address_space(0)))指針地址必須在內核地址空間
__iomem__attribute__((noderef, address_space(2)))指針地址必須在設備地址空間
__safe__attribute__((safe))變量可以為空
__force__attribute__((force))變量可以進行強制轉換
__nocast__attribute__((nocast))參數類型與實際參數類型必須一致
__acquires(x)__attribute__((context(x, 0, 1)))參數x 在執行前引用計數必須是0,執行后,引用計數必須為1
__releases(x)__attribute__((context(x, 1, 0)))與 __acquires(x) 相反
__acquire(x)__context__(x, 1)參數x 的引用計數 + 1
__release(x)__context__(x, -1)與 __acquire(x) 相反
__cond_lock(x,c)((c) ? ({ __acquire(x); 1; }) : 0)參數c 不為0時,引用計數 + 1, 并返回1

其中 __acquires(x) 和 __releases(x), __acquire(x) 和 __release(x) 必須配對使用, 否則 Sparse 會給出警告

: 在Fedora系統中通過 rpm 安裝的 sparse 存在一個小bug.

即使用時會報出 error: unable to open ’stddef.h’ 的錯誤, 最好從自己源碼編譯安裝 sparse.

參考: http://wangcong.org/blog/archives/504

2. Sparse 使用方法2.1 __bitwise 的使用

主要作用就是確保內核使用的整數是在同樣的位方式下.

在內核代碼根目錄下 grep -r '__bitwise', 會發現內核代碼中很多地方都使用了這個宏.

對于使用了這個宏的變量, Sparse 會檢查這個變量是否一直在同一種位方式(big-endian, little-endian或其他)下被使用,

如果此變量在多個位方式下被使用了, Sparse 會給出警告.

內核代碼中的例子:

/* 內核版本:v2.6.32.61  file:include/sound/core.h 51行 */typedef int __bitwise snd_device_type_t;

2.2 __user 的使用

如果使用了 __user 宏的指針不在用戶地址空間初始化, 或者指向內核地址空間, 設備地址空間等等, Sparse會給出警告.

內核代碼中的例子:

/* 內核版本:v2.6.32.61  file:arch/score/kernel/signal.c 45行 */static int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)

2.3 __kernel 的使用

如果使用了 __kernel 宏的指針不在內核地址空間初始化, 或者指向用戶地址空間, 設備地址空間等等, Sparse會給出警告.

內核代碼中的例子:

/* 內核版本:v2.6.32.61  file:arch/s390/lib/uaccess_pt.c 180行 */memcpy(to, (void __kernel __force *) from, n);

2.4 __iomem 的使用

如果使用了 __iomem 宏的指針不在設備地址空間初始化, 或者指向用戶地址空間, 內核地址空間等等, Sparse會給出警告.

內核代碼中的例子:

/* 內核版本:v2.6.32.61  file:arch/microblaze/include/asm/io.h 22行 */static inline unsigned char __raw_readb(const volatile void __iomem *addr)

2.5 __safe 的使用

使用了 __safe修飾的變量在使用前沒有判斷它是否為空(null), Sparse會給出警告.

我參考的內核版本(v2.6.32.61) 中的所有內核代碼都沒有使用 __safe, 估計可能是由于隨著gcc版本的更新,

gcc已經會對這種情況給出警告, 所以沒有必要用Sparse去檢查了.

2.6 __force 的使用

使用了__force修飾的變量可以進行強制類型轉換, 沒有使用 __force修飾的變量進行強制類型轉換時, Sparse會給出警告.

內核代碼中的例子:

/* 內核版本:v2.6.32.61  file:arch/s390/lib/uaccess_pt.c 180行 */memcpy(to, (void __kernel __force *) from, n);

2.7 __nocast 的使用

使用了__nocast修飾的參數的類型必須和實際傳入的參數類型一致才行,否則Sparse會給出警告.

內核代碼中的例子:

/* 內核版本:v2.6.32.61  file:fs/xfs/support/ktrace.c 55行 */ktrace_alloc(int nentries, unsigned int __nocast sleep)

2.8 __acquires __releases __acquire __release的使用

這4個宏都是和鎖有關的, __acquires 和 __releases 必須成對使用, __acquire 和 __release 必須成對使用, 否則Sparse會給出警告.

2.9 __cond_lock 的使用

這個宏有點特別, 因為沒有 __cond_unlock 之類的宏和它對應.

之所以有這個宏的原因可以參見: http://yarchive.net/comp/linux/sparse.html 最后一段.

這個宏的來源清楚了, 但是為什么這個宏里面還要調用一次 __acquire(x)? 我也不是很清楚, 在網上找了好久也沒找到, 誰能指教的話非常感謝!!!

3. Sparse 在編譯內核中的使用

用 Sparse 對內核進行靜態分析非常簡單.

# 檢查所有內核代碼make C=1 檢查所有重新編譯的代碼make C=2 檢查所有代碼, 不管是不是被重新編譯

4. 補充

Sparse除了能夠用在內核代碼的靜態分析上, 其實也可以用在一般的C語言程序中.

比如下面的小例子:

/****************************************************************************** * @file    : sparse_test.c * @author  : wangyubin * @date    : Fri Feb 28 16:33:34 2014 *  * @brief   : 測試 sparse 的各個檢查點 * history  : init ******************************************************************************/#include <stdio.h>#define __acquire(x) __context__(x,1)#define __release(x) __context__(x,-1)int main(int argc, char *argv[]){    int lock = 1;    __acquire(lock);    /* TODO something */    __release(lock);            /* 注釋掉這一句 sparse 就會報錯 */    return 0;}

如果安裝了 Sparse, 執行靜態檢查的命令如下:

$ sparse -a sparse_test.c sparse_test.c:15:5: warning: context imbalance in 'main' - wrong count at exit

Sparse相關資料可以參考wiki: Sparse wiki


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线亚洲在线| 日韩美女av在线| 亚洲国产精品99久久| 日韩美女主播视频| 久热精品视频在线免费观看| 91精品国产91久久久久福利| 久久久久国产一区二区三区| 亚洲最大福利网| 欧美性色19p| 国产精品夜色7777狼人| 久久精品视频在线观看| 欧美日韩国产一区中文午夜| 国内揄拍国内精品| 亚洲精品中文字幕女同| 欧美色另类天堂2015| 91po在线观看91精品国产性色| 九九久久国产精品| 亚洲成人网在线观看| 国产精品亚洲网站| 欧美专区中文字幕| www高清在线视频日韩欧美| 国产精品国产三级国产aⅴ9色| 一色桃子一区二区| 国产精品嫩草影院久久久| 成人有码视频在线播放| 亚洲电影第1页| 日韩精品中文字幕在线| 精品成人久久av| 日韩第一页在线| 国产日韩换脸av一区在线观看| 精品国产一区二区三区久久| 欧美黑人国产人伦爽爽爽| 美女av一区二区三区| 国产精品va在线播放| 日产精品久久久一区二区福利| 亚洲在线观看视频网站| 狠狠躁天天躁日日躁欧美| 日韩欧美在线视频免费观看| 亚洲欧美在线x视频| 久久亚洲精品国产亚洲老地址| 欧美久久精品午夜青青大伊人| 九九热在线精品视频| 亚洲成人a级网| 欧美成人精品激情在线观看| 欧美激情国内偷拍| 欧美最顶级丰满的aⅴ艳星| 一色桃子一区二区| 国内精品模特av私拍在线观看| 亚洲精品日韩久久久| 国产亚洲精品激情久久| 成人国产精品一区| 欧美高清理论片| 欧美一区二区.| 日韩美女主播视频| 久久久精品在线观看| www.日本久久久久com.| 欧美国产日本高清在线| 裸体女人亚洲精品一区| 91精品久久久久久| 亚洲第一av网站| 91国产精品91| 欧美怡红院视频一区二区三区| 精品久久香蕉国产线看观看gif| 久久99国产精品久久久久久久久| 国产美女被下药99| 色偷偷91综合久久噜噜| 亚洲国产欧美一区二区三区同亚洲| 国产精品video| 成人在线视频福利| 国产精品啪视频| 久久夜精品va视频免费观看| 亚洲精品国精品久久99热一| 久久视频在线免费观看| 国产美女主播一区| 欧美成人激情视频免费观看| 亚洲激情第一页| 久久久久久亚洲精品中文字幕| 欧美精品在线免费| 国产精品成人久久久久| 国产精品久久久久一区二区| 欧美自拍视频在线| 久久精品国产久精国产思思| 久久免费视频观看| 亚洲欧洲在线看| 亚洲色图五月天| 国产精品久久999| 日韩av观看网址| 欧美日韩在线视频首页| 日韩在线视频导航| 日韩av一卡二卡| 一区二区在线免费视频| 性欧美长视频免费观看不卡| 亚洲永久免费观看| 成人免费在线网址| 久久夜色精品国产欧美乱| 久久免费高清视频| 国产一区二区三区欧美| 亚洲免费av片| 97精品一区二区视频在线观看| 欧美日韩综合视频网址| 日韩精品视频观看| 国产精品入口日韩视频大尺度| 日韩免费看的电影电视剧大全| 欧美日韩国产中文字幕| 国内精品久久久久久影视8| 国产丝袜精品第一页| 成人激情视频免费在线| 国产免费观看久久黄| 91av在线免费观看| 亚洲成人久久网| 国产精品爽爽爽| 亚洲伦理中文字幕| 欧美韩国理论所午夜片917电影| 久久久视频免费观看| 91在线免费看网站| 97国产成人精品视频| 深夜福利国产精品| 日韩av在线高清| 粉嫩老牛aⅴ一区二区三区| 亚洲精品久久视频| 久久人体大胆视频| 成人av资源在线播放| 2019中文在线观看| 红桃视频成人在线观看| 国产日韩欧美日韩大片| 日韩一区二区三区xxxx| 最近2019中文字幕mv免费看| 国产精品日日做人人爱| 国产成人精品一区二区三区| 91亚洲午夜在线| 91免费精品国偷自产在线| 91精品国产综合久久久久久蜜臀| 热久久免费视频精品| 日本欧美一级片| 这里只有精品在线观看| 在线观看不卡av| 亚洲自拍偷拍在线| 欧美老女人在线视频| 国产精品日韩在线| 久久久久久久久久久人体| 日韩精品视频免费在线观看| 欧美亚洲另类视频| 日韩av免费在线看| 91精品久久久久久久久青青| 在线观看视频亚洲| 成人免费看吃奶视频网站| 欧美激情喷水视频| 国产中文日韩欧美| 精品国产鲁一鲁一区二区张丽| 亚洲欧美精品一区| 亚洲欧美日韩高清| 亚洲精品aⅴ中文字幕乱码| 中文字幕一区二区三区电影| 日韩av网站大全| 69精品小视频| 高清欧美一区二区三区| 青青草原成人在线视频| 理论片在线不卡免费观看| 欧美成人第一页| 欧美高清一级大片| 日韩精品视频免费在线观看| 日韩欧美国产成人| 国产美女久久久| 日本成人激情视频|