sparseプログラムについて
sparseプログラムは、Linuxカーネルで使用されているソースコードチェッカーです。
sparseプログラムは、静的にプログラムをチェックし、間違いがあれば警告を出してくれます。Linuxカーネルのソースコードにおいて、ユーザ空間へのポインタとカーネル空間へのポインタが混在してしまっていたのをチェックするために、Linusが2003年に最初に作ったみたいです。
sparseプログラムは、静的にプログラムをチェックし、間違いがあれば警告を出してくれます。Linuxカーネルのソースコードにおいて、ユーザ空間へのポインタとカーネル空間へのポインタが混在してしまっていたのをチェックするために、Linusが2003年に最初に作ったみたいです。
sparseのソースコードは、こちら
使い方
まだよく調べていませんが、sparce ソースコード名 とすればチェックしてくれるようです。
Linuxカーネルのソースコードに対してsparseしたいときには、make C=2 とします。
Linuxカーネルのソースコードに対してsparseしたいときには、make C=2 とします。
チェックされる項目は、manページに詳しく書いてありますが、少しだけ紹介すると
ある変数が __attribute__((条件))という書式で定義されていたとき、その変数がちゃんと条件通りに正当に使用されているいるか
チェックしてくれるみたいです。
条件の種類は、
- noderef:*pointerのようにアスタリスクでポインタの先を参照しないこと。
- address_space(X):Xというアドレス空間内でポインタが使用されていること。他のアドレス空間を指し示すポインタに代入したり、キャストしてはならない。
- force:とにかく強制的に実行する。上記の条件を無視してキャストしたり参照したりできる。
というものがあります。もっとありますが、知りたい方はmanページを参照してくださいませ。
Linuxカーネルでは、どのように使われているのか?
__iomemは、
__attribute__((noderef,address_space(2)))
となっていて、アドレス空間2以外での作業用途には使えないようになっています。また、*(アスタリスク)で参照できないようになっています。
また__userは、
__attribute__((noderef,address_space(1)))
となっていて、アドレス空間1以外での作業には使えないようになっています。また、*(アスタリスク)で参照できないようになっています。
例えば、copy_to_userは次のように宣言されています。
unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
なので、toというポインタは直接参照することもできませんし、他のアドレス空間へのキャストもダメということになります。
ちなみに、Linuxカーネルソースコード内で使われているアドレス空間ですが、
| アドレス空間名 | 空間番号 |
|---|---|
| カーネル空間 | 0 |
| ユーザ空間 | 1 |
| IO空間 | 2 |
となっているみたいです。
もちろん、アドレス空間10みたいなのを使って問題ないです。もちろん、アドレス空間10の変数同士でしか、やりとり出来なくなります。
もちろん、アドレス空間10みたいなのを使って問題ないです。もちろん、アドレス空間10の変数同士でしか、やりとり出来なくなります。
ところで、Linuxカーネルをコンパイルするときに、Cオプションをつけなかった場合、
#define __user #define __iomem
というようにマクロ定義されるらしく、__userと__iomemは単純に消えるだけです。
なので、__userとかを頑張って使っていたとしてもCオプション使わなかったら、意味はありません。
なので、__userとかを頑張って使っていたとしてもCオプション使わなかったら、意味はありません。
このwikiの更新情報RSS