人に聞けない痔の悩み、これでスッキリ >>

UNIX系OSで動作するものでC言語を解析してmain()からの関数の流れを出力してくれるようなツールを探しています。
GUIはあまり期待していません、自作しようと思っていたのですが世の中にあるツールを見てからでも遅くないと思いました。
誰が作ったかわからないようなソースを維持管理することになった為、このような質問を致しました。
どうか、情報があったら教えて下さい。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

GUIで解析するツールもあります。


http://www.scitools.com/

伝統的なCUI系では、cflowというのがあります。
http://rpmfind.net/linux/RPM/Development_Tools.h …

そのほか、ソースからHTMLでドキュメントを作るcxrefというのもあります。

参考URL:http://www.scitools.com/,http://rpmfind.net/linux/RPM/Development_Tools.h …
    • good
    • 0
この回答へのお礼

非常に興味を持って拝見させていただきました
これを理解し、使いこなせるように頑張ってみます
貴重な情報をありがとうございました。

お礼日時:2003/11/05 17:58

GNU GLOBAL というのもあります.


emacs から tagjump させるのが一般的ですが,HTML 作成機能もあります.
    • good
    • 0
この回答へのお礼

機能を理解するには至っておりませんが
引き続き頑張ってみます。
貴重な情報をありがとうございました。

お礼日時:2003/11/05 18:01

下記リンクのようなツールはどうでしょう。



PADという、形式で出力します。
ご参考まで。

参考URL:http://www.aerith.net/project/pad2ps-j.html

この回答への補足

僕のほしいものよりちょっと細かい解析ツールですね。
簡単なツリー構造で関数の呼び出し関係が分かって、ソースの指定はディレクトリで出来て..といった感じをイメージしていました、言葉が足りなくてすいません。
でも別のことに使うかもしれません、ありがとうございます。

補足日時:2003/11/04 16:36
    • good
    • 0
この回答へのお礼

情報ありがとうございます、参考にいたします。

お礼日時:2003/11/04 16:35

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLinuxのgccのインクルードパス?

Linuxのgccで、インクルードファイルやライブラリのパスを設定する方法が知りたいのですが、gccについて詳しい書籍やサイトがありましたら、教えてください。

gccとccの違いも知りたいです。

例)
#include "example.h"

このままだと、example.hが無いと表示されます。

Aベストアンサー

標準ライブラリのパスは、gccのインストール時に指定して、Cプリプロセッサの中に組み込まれます。

#include "example.h"
は、まずカレントディレクトリを探し、次に gccコマンドラインの -I オプションで指定したディレクトリを探し、最後に標準ライブラリが探されます。

#include <example.h>
は、カレントディレクトリを探さない点が異なります。

ccも基本的には同じですが、Unixの種類によって機能が異なる可能性があります。Linuxの場合はcc=gccです。

Qc言語の変数一覧の取得

c言語で書かれたコードについて、使われている変数名や関数名の一覧を取得することはできるのでしょうか?

何か方法がありましたら教えてください。

Aベストアンサー

C言語ソース解析ツール「Anlc」というのがあります。
機能は以下の通りです。
(1) 全関数一覧
(2) 関数定義一覧
(3) 関数プロトタイプ一覧
(4) HTMLドキュメント作成
(5) 関数ツリー
(6) ステップ数一覧
(7) 関数ステップ数一覧
(8) インクルード一覧
(9) デファイン定義一覧
(10)使用中デファイン定義一覧
(11)変数一覧
(12)typedef一覧
(13)プリプロ削除ファイル作成
(14)コメント削除ファイル作成
(15)プリプロ・コメント削除ファイル作成
(16)構造体・共用体一覧
(17)テスト雛形作成

シェアウェア:1,870円(税込)なのが難点ですが、
変数名や関数名の一覧は、試用期間中でも問題なく行えます。
ダウンロードは、参考URLからどうぞ。

参考URL:http://www.vector.co.jp/soft/winnt/prog/se362671.html

Q#defineの定数を文字列として読み込む

#define A "xxx"
#define B "yyy"
と定義しておいて

scanf("%s", str)
で読み込んだ文字列strが
"xxx"だった場合、"yyy"だった場合のように分岐したいのですが
このとき

if(str == "xxx")
のように中身を指定するのではなく

if(str == AA)
のように定数で分岐させることってできますか?

上記のままではできませんが、何か特別な関数とかでできるのでしょうか?

Aベストアンサー

こんにちは。

やりたいことの解釈ですが、(※勘違いの場合はすみません。)

1)マクロの名前(定義名)が文字列として格納された文字列 str があるとする。
 例)
   #define A "xxx"  //マクロ名=A
   char str[] = "A";   //"A"はマクロ名

2)上記の文字列 str を関数 func に渡す際に、マクロ名ではなくそのマクロで
  定義された文字列を渡したい。
 例)
   func( str );    //←この場合
    ↓
   func( "xxx" );  //←として展開される

ということで宜しいでしょうか?

だとした場合、少し回りくどいやり方かもしれませんが、以下のような文字列
変換用のマクロを定義してみては如何でしょうか?
※基本的には、他の回答者の方と同じように strcmp関数 を使用します。

■マクロ例
==============================
//文字列を定義したマクロ …※1
#define A "xxx"
#define B "yyy"

//引数を文字列として取得するマクロ
#define GETSTR(x) #x

//引数をマクロ名としてそのマクロで定義された文字列を取得するマクロ …※2
//注)<string.h>がインクルードされていることを前提とする
#define STR2MAC(str) \
!strcmp(str,GETSTR(A))? A : \
!strcmp(str,GETSTR(B))? B : str
==============================

上記マクロを使用して、関数 func にマクロ名が格納された文字列 str を
渡す場合は、
   func( STR2MAC( str ) );
のような記述になります。

前提として、※2のマクロ内でstrcmp関数を用いて文字列の照合を行って
いますので、<string.h>のインクルードが必要になります。

また、※1の文字列を定義するマクロの種類(パターン)を増やす場合、
※2のマクロの判定文もそれに合わせて増やす必要があります。

上記のマクロを使用したサンプルソースを下記に掲載致します。
注)エラー処理は行っていません。

■サンプルソース
==============================
#include <stdio.h>
#include <string.h>

//文字列を定義したマクロ
#define A "xxx"
#define B "yyy"

//引数を文字列として取得するマクロ
#define GETSTR(x) #x

//引数をマクロ名としてそのマクロで定義された文字列を取得するマクロ
//注)<string.h>がインクルードされていることを前提とする
#define STR2MAC(str) \
!strcmp(str,GETSTR(A))? A : \
!strcmp(str,GETSTR(B))? B : str

//プロトタイプ
void funcHoge( const char *str );

int main(void)
{
char sArg[128];

printf( "A or B ?>" );
scanf( "%s", sArg );

printf( "string1: %s\n", sArg );
funcHoge( STR2MAC(sArg) );

return 0;
}

void funcHoge( const char *str )
{
printf( "string2: %s\n", str );
}
==============================

■上記サンプルの実行結果
≫実行その1≪
A or B ?>A
string1: A
string2: xxx

≫実行その2≪
A or B ?>B
string1: B
string2: yyy

≫実行その3≪
A or B ?>hoge
string1: hoge
string2: hoge

以上です。

こんにちは。

やりたいことの解釈ですが、(※勘違いの場合はすみません。)

1)マクロの名前(定義名)が文字列として格納された文字列 str があるとする。
 例)
   #define A "xxx"  //マクロ名=A
   char str[] = "A";   //"A"はマクロ名

2)上記の文字列 str を関数 func に渡す際に、マクロ名ではなくそのマクロで
  定義された文字列を渡したい。
 例)
   func( str );    //←この場合
    ↓
   func( "xxx" );  //←として展開される

ということで宜しいでしょう...続きを読む

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

Qprintf で二進表示を行いたい。

すみません。教えていただきたいことがあります。
printf で普通のintの値をフォーマット指定子を使用して二進表示をしたかったのですが見当たりませんでした。
どうにかintの内容を二進で確認したいのですが、どのようにすれば良いですか?
宜しくお願いします。

Aベストアンサー

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if ( value & bit ){
  putchar('1');
 }
 else{
  putchar('0');
 }
}
printf( " です。\n" );

最後に:
・1バイトが 8 ビットの環境が前提です。→まぁ、普通は 8 ビットですが…。
・上記のサンプルを関数などにすれば使いやすくなります。→print_bin()など
・以上。おわり。

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if...続きを読む

Qunsigned long long 型のフォーマット指定子

unsigned long long 型の変数の値を表示したいのですが、
フォーマット指定子は%ldですか?
よろしくおねがいします。

Aベストアンサー

規格上は、%llu のように ll を付けます。(unsigned long longなので、%lld ではなく %llu です。)
ただし、C99に準拠した処理系ではなく、単に独自拡張としてlong long型をサポートしている場合には、%Lu とか %qu とかになる場合もあります。場合によっては、long long型が存在する処理系でも、printf系関数で正しく書式化する方法が存在しないこともあり得ます。

QExcelで正規表現やワイルドカードなどを使って置換したいのですが…

Excelの中で置換をしたいのですが、
例えば以下のように( )かっこでくくられた不規則な数字を検索し、その前後に記号を付加するといった具合です。
Wordだと置換で正規表現が使えますが、Excelではやはりマクロを作らないとだめなのでしょうか?

 置換前
  あいう(123)かきく(あああ)
  さしす(ははは)たち(589)つ
   ・      ・
   ・      ・

 置換後
  あいう★(123)★かきく(あああ)
  さしす(ははは)たち★(589)★つ
   ・      ・
   ・      ・

Aベストアンサー

以下の正規表現アドインを使用すると可能です。
http://srcedit.pekori.jp/tool/excelre.html

置換前 ((\d+))
置換後 ★$1★

Qwindows.hがincludeされない

http://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/を見ながら何度も試したのですがどうしてもwindows.hがインクルードされません。上記のページに書いてあること以外に必要な作業があるのでしょうか?

Aベストアンサー

回答見る限り、パスが設定されてないっぽいですね。

具体的には
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/usingpsdk/
の手順3です。

VC++ 2005のメニューから、
ツール → オプション → プロジェクトおよびソリューション → VC++ ディレクトリ
で、
ディレクトリを表示するプロジェクト→
・実行可能ファイル
・インクルードファイル
・ライブラリファイル
の3つの場所にそれぞれ手順3に書かれたパスを追加します。

インクルードファイルの項に追加したパスが、windows.hのある場所なので、これで大丈夫だと思います。
自分もここでつまずいたので…

QC++ソースからUMLの設計書を作るには

C++ソースからUMLを使った設計書を起こしたいです。
設計書等は一切ありません。
総ステップ数12万超です。複数のcppファイルに分かれています。
オブジェクト指向に基づいて開発されているので、クラスからクラスへと更には別のcppファイルへと呼び出されていくので、どこから見ていったら良いか悩んでいます。
まずはクラス図から作った方が良いのでしょうか?
C++ソースから設計書を起こすには、どこから手を付けたら良いか、アドバイスお願いいたします。

Aベストアンサー

ANo.1の回答と同じく、Doxygenがお勧めです。フリーで使えます。
Doxygenでなくても、他にも静的コード解析ツールが沢山あります。
http://ja.wikipedia.org/wiki/%E9%9D%99%E7%9A%84%E3%82%B3%E3%83%BC%E3%83%89%E8%A7%A3%E6%9E%90

業務でなさるのでしたら、QAC (http://www.toyo.co.jp/ss/qac/index.html)なんてのもありますが、かなりの予算が必要ですのであまりお勧めしません。

> まずはクラス図から作った方が良いのでしょうか?
> C++ソースから設計書を起こすには、どこから手を付けたら良いか

意外とこういうことについて体系立てて説明したものって無いんですよね。で、私はどうしているかというと、ツールを使っていません。次のような方針でコード解析しています。

--------------------------------------------
1.プログラムが提供する主要な機能を理解する。
(1) そのプログラムが提供する機能を大雑把にリストアップする。
(2) コンパイル、ビルドして動かしてみる。(使ってみる)

2.プログラムの論理構造を図示する。
(1) ディレクトリ構造やファイル名などから構造を推理する。
(2) 各ファイルのヘッダコメントからそのクラス(モジュール)の概要を書き出す。
(3) 集中して読み解くべき主要なクラス(モジュール)を絞り込む。
(4) 絞り込んだクラス(モジュール)について、呼び出し関係を図示する。

3.プログラムの処理構造を把握する。
(1) デバッガを使って、プログラム起動から待機状態にまるまでの初期化処理の流れを追いかける。
(2) 1.で最初にリストアップした主要な機能を実行して、処理の流れを追いかける。

4.自分で機能を追加してみる。
--------------------------------------------
私は、自分で機能を追加できるようになったら、もう充分そのプログラムを理解したといっていいんじゃないかと思っています。

それがどんな機能を提供するプログラムなのか知らないでコードを読み始める無謀な人はいないと思いますが念のため。仕様書があればベストですが、なくてもREADME.TXTみたいなファイルがどこかにあれば多少は推測できるかと思います。

今回kanakokanakoさんが飛び込もうとしているソースコードは12万行という大海なわけですが、本当にコード深くまで潜って読む価値のある部分は全体の1~2割程度の2~3万行ではないかと予想します。重要そうなクラス(モジュール)は、ファイル名やファイルサイズ(=1つのファイルの論理コード行数)から推測できます。そして、そういう重要な部分はそのドメインの専門知識が無いとソースコードを読んでも(仮に仕様書があってその仕様書を読んだとしても)意味がわからないから厄介なのですが・・・

今回何のためにソースから設計書を起こすことになったか存じませんが、誰が何のために読む仕様書なのか、狙いを外さない仕様書になることをお祈りします。

単にファイル名や関数の役割をだらだらと書き連ねた設計書はゴミです。労力の無駄。誰もそんなもの読みません。設計者の意図が、コンセプトがわかる仕様書を書いてくれ!と、言おうと思ったら私が仕様書を書く立場になっていました (^-^;A

ANo.1の回答と同じく、Doxygenがお勧めです。フリーで使えます。
Doxygenでなくても、他にも静的コード解析ツールが沢山あります。
http://ja.wikipedia.org/wiki/%E9%9D%99%E7%9A%84%E3%82%B3%E3%83%BC%E3%83%89%E8%A7%A3%E6%9E%90

業務でなさるのでしたら、QAC (http://www.toyo.co.jp/ss/qac/index.html)なんてのもありますが、かなりの予算が必要ですのであまりお勧めしません。

> まずはクラス図から作った方が良いのでしょうか?
> C++ソースから設計書を起こすには、どこから手を付けたら良いか
...続きを読む


人気Q&Aランキング