ページ 11

構文チェッカーを作ろうと考えています。

Posted: 2015年5月17日(日) 09:55
by たかし
C言語で構文チェッカーを作ろうと考えています。
コンパイラが見逃してしまうようなエラーを、プログラムのコードを静的に検査し、問題のある記述法をしている個所を検出し、アドバイスを出すようなプログラムを開発したいです。

例えば、関数を呼び出したときに、入力データがバッファ領域を超える長さの時、バッファオーバーフローが引き起こされ、リターンアドレスを書きかえることで、悪意のあるコードが実行されてしまうことがあります。
これを防ぐために入力データの長さをチェックするように促すようなアドバイスを出せるようにしたいです。

プログラムを静的検査するとなると、形態素解析によって、プログラムのコードという長い文字列の中にある、型や変数、関数などの分類をして、プログラムの構成をコンピュータに理解させる必要があると思います。
このプログラムの形態素解析をどのような方法でやればよいのかわかりません。
例えば、次のような関数があったとします。

コード:

void func(char *s1) {
    char s2[16];
    strcpy(s2,s1);
}
func は char 型のポインタ変数 s1 を引数として受け取り,char 型の配列 s2 に s1 が指す文字列をコピーします.ここで,s1 の指す文字列のサイズが s2 のサイズを超えていた場合,3 行目の strcpy(s2,s1) でバッファオーバーフローが発生します.バッファオーバーフローが発生するとあふれたデータによってスタックが破壊 (書き換え) されてしまいます.

これに対して、「s1とs2の長さを確認してください」というようなコメントが出せるようにしたいです。

どのような手順で進めていけばよいのかわかりません。
形態素解析でなくても何かほかによりよいやり方があれば教えてください。
よろしくお願いいたします。

Re: 構文チェッカーを作ろうと考えています。

Posted: 2015年5月17日(日) 10:24
by h2so5
形態素解析は主に自然言語処理において利用されるものです。プログラミング言語では普通、形態素解析はしません。
「C言語 構文解析」で検索すればいくらかヒットするのでそれで概要を掴んでみたほうがよいと思います。

ちなみに、そのようなバッファオーバーフローを静的に検出するのは困難です。
関数の引数に定数を渡しているようなケースならなんとかなりますが。

Re: 構文チェッカーを作ろうと考えています。

Posted: 2015年5月17日(日) 10:45
by たかし
h2so5 様、回答ありがとうございます。

>「C言語 構文解析」で検索すればいくらかヒットするのでそれで概要を掴んでみたほうがよいと思います。
さっそく調べてみます。

>ちなみに、そのようなバッファオーバーフローを静的に検出するのは困難です。
>関数の引数に定数を渡しているようなケースならなんとかなりますが。
それでは検出できるようなエラーについてまずは取り組んでみます。

ありがとうございました!

Re: 構文チェッカーを作ろうと考えています。

Posted: 2015年5月17日(日) 11:26
by daive
古めですが、
Fail-Safe C: 安全なC言語コンパイラ:産総研
https://www.rcis.aist.go.jp/project/FailSafeC-ja.html
Fail-Safe C: Top Page
で、ソースが公開されています。

検索ワード:
Microsoft C K&R 関数
C K&R 関数
辺りから検索されると、
K&R 時代の関数の使用は、推奨されない事。
新たに実装された安全な関数が、使用可能であれば、
そちらを使用する事とするのが、解ると思います。
(処理系、OSが不明ですから、具体的な部分は、御自分で検索してください。)

Re: 構文チェッカーを作ろうと考えています。

Posted: 2015年5月17日(日) 14:42
by softya(ソフト屋)
バッファのサイズ・チェックをある一定のルールで行うならLintで出来そうな気がします。
他にも静的チェックのツールはあるのでご確認を。
http://ja.wikipedia.org/wiki/静的コード解析#C. ... .A8C.2B.2B
本格的に自分で作るなら何年もかかるシロモノになるかと。

Re: 構文チェッカーを作ろうと考えています。

Posted: 2015年5月17日(日) 17:53
by ISLe()
方向性が違うかもしれませんが
LLVMとか。