2010年01月20日

sparse チェッカーを使ってみる。

前回の記事で少し触れた、Linux で使われているソースコード解析ツールである sparse は、Linux Kernel 以外のソースコードに対しても有益そうです。

Sparse - a Semantic Parser for C

MinGW 環境で試してみたところ、ちゃんと GNU C のソースコードを解析することができました。



ソースコードは git から持ってきても良いですし、私は以下から tarball をダウンロードしました。

http://www.codemonkey.org.uk/projects/git-snapshots/sparse/

sparse-2010-01-06.tar.gz を展開します。

compat-mingw.c というファイルがあるので、どうやら MinGW でもビルドできそうな感じです。
Makefile で、最初 linux になっている OS という変数を、mingw に変更し、ビルドできました。
(autotools などは使って無いようです。)
$ diff -u Makefile Makefile.orig
--- Makefile Tue Jan 12 14:20:58 2010
+++ Makefile.orig Tue Jan 12 14:20:53 2010
@@ -1,6 +1,6 @@
VERSION=0.4.2

-OS = mingw
+OS = linux


CC = gcc

例題として、以下のようなプログラムを用意しました。
異なるメモリ領域へのポインタを返している bad 関数には警告を出して欲しいところです。
#define __mem0 __attribute__((address_space(0)))
#define __mem1 __attribute__((address_space(1)))
void __mem0 *good(void __mem0 *x);
void __mem1 *bad(void __mem0 *x);
void __mem0 *good(void __mem0 *x)
{
    return x;
}
void __mem1 *bad(void __mem0 *x)
{
    return x;
}

sparse.exe を実行すると、以下のように、ちゃんと警告を出してくれました。(また、関数のプロトタイプが無いと警告を出してくれます。)
$ sparse.exe test.c
test.c:14:12: warning: incorrect type in return expression (different address sp
aces)
test.c:14:12: expected void *
test.c:14:12: got void *x


トラックバックURL

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード