GUIアプリ解析

今週は、GUIアプリの解析をおこないました。なにぶん手を付けたばっかりなので、これという成果もありません。そこで、こんなやり方をしているよ、という所をご紹介します。「他人の書いたプログラムを読む」方法について、少しは参考になるでしょうか。

GUIアプリは、だいたい7000行ちょいの、かなり小さなものです。しかし、このGUIは EFLTK という未知のツールキットに依存しています。そして、RTAIという未知のAPIにも依存しています。解析するのは簡単ではありません。

設計書もないソフトウェアを読みながら解析するのって、けっこうウンザリしますね。みなさん、どうやっているのでしょうか。良い方法をご存じの方は、教えていただけると嬉しいです。

解析のやり方

まずはGUIアプリの全体を把握しようと、ソースコードをじーっと眺めているのですが、さっぱり頭に入って来ません。それどころか、「こんなのやってられるかぁ!!!」とイライラしてくるしまつです。

何が悪いんだろう?という話なんですが、きっと脳みそが小さいんですね。いや、物理的な大きさとかじゃなくてですね、こう、一度に覚えておける量が少ないんです。人の顔とかよく忘れますしね。(悪意はないんですよ!)

freehils07_00

きっと頭のいい人であれば、ソースコードをざざざーっと呼んで、7kくらいの量であれば簡単に把握しちゃうんですよね。そんな人、いっぱい知ってます。でも私には無理です。年のせいじゃありません。むかしからこうでしたから。

とまぁこんな感じですから、ふつうのやり方じゃあどうにもなりません。しかたが無いので、「情報」というものの持つ有り難い性質を活用することにします。

実は、「情報」って折りたためるんですよね。いくらでも小さく。だから、いっぱい情報があっても大丈夫。私の小さな脳みそに入る程度に、折りたたんでしまえばいいんです。

たとえば、こうです。GUIアプリのソースコードの一部に、こんなものがありました。

static long try_to_connect(const char *IP)
{
	int counter = 0;
	int counter_max = 5;
	char buf[100];
	long port;
	struct sockaddr_in addr;

	sprintf(buf, "Trying to connect to %s", IP);
	RLG_Main_Status->label(buf);
	RLG_Connect_Button->deactivate();
	RLG_Main_Window->redraw();
	if (Verbose) {
		printf("%s...", buf);
		fflush(stdout);
	}
	inet_aton(IP, &addr.sin_addr);
	Target_Node = addr.sin_addr.s_addr;
	while ((port = rt_request_port(Target_Node)) <= 0 && counter++ <= counter_max) {
		msleep(100);
	}

	return port;
}

まずは頑張って処理を追ってみます。

ふむふむ。

RLG_Main_Status->label( buf ) か。良く分からんが、なんか表示してるんだろう。

RLG_Connect_Button->deactivate(); か。接続ボタンをディセーブルしてるのかな?

・・・

inet_aton, rt_request_portか・・・知らない関数だ。でもなんか、ポートってやつを取ろうとしてるんだな。IPってシンボルはグローバル変数かな?まぁIPアドレスの事だろう

はい。もう私の頭は try_to_connect の事でいっぱいです。他の関数の処理みたら、 try_to_connect の事は忘れます。

そこで、try_to_connectの処理を、こう言ってしまいます。

「指定されたIPをもつマシンにアクセスし、何かポート番号ちっくなものを取ってくる」

これだけ。枝葉を切り落として、本質だけ抜き出します。これだけでもすぐに忘れちゃいますから、Excelシートに書き込んでおきましょう。

freehils07_01

こんな感じで、関数名一覧をExcelに書き出しておいて、そこに1行、処理内容を書きこんでおきます。

これで安心。次の関数に行きましょう。そうして次の関数を追っているとき、 try_to_connect が出てくるかも分かりません。でも大丈夫。Excelシートをひょいとみれば、あぁそうだった!と思いだせます。

こうやって解析をすすめていくうちに、「何かポート番号ちっくなもの」って正確には何の事なのか?も分かってくる事でしょう。今はこれで十分です。

まぁこんな感じでやっています。「情報が多すぎて頭に入らない」→「頭に入る大きさまで、情報を折りたたむ」→「構造化して格納する」。これをやっていれば、だいたいの事は頭に入ってしまいます。(もちろん枝葉は大量に切り落としているので、あとから必要に応じて再調査します。)

次回

RTAIの使い方が、なんとなく見えてきました。来週は頑張って、このあたりを整理したいと思います。