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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たかし
記事: 48
登録日時: 11年前

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

#1

投稿記事 by たかし » 8年前

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の長さを確認してください」というようなコメントが出せるようにしたいです。

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 8年前

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

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

たかし
記事: 48
登録日時: 11年前

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

#3

投稿記事 by たかし » 8年前

h2so5 様、回答ありがとうございます。

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

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

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

daive
記事: 11
登録日時: 9年前

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

#4

投稿記事 by daive » 8年前

古めですが、
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が不明ですから、具体的な部分は、御自分で検索してください。)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 8年前

バッファのサイズ・チェックをある一定のルールで行うならLintで出来そうな気がします。
他にも静的チェックのツールはあるのでご確認を。
http://ja.wikipedia.org/wiki/静的コード解析#C. ... .A8C.2B.2B
本格的に自分で作るなら何年もかかるシロモノになるかと。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe()

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

#6

投稿記事 by ISLe() » 8年前

方向性が違うかもしれませんが
LLVMとか。

閉鎖

“C言語何でも質問掲示板” へ戻る