• 締切済み

C言語ソースコードの解析

私は現在組み込みのプロジェクトに参加おります、新米プログラマです。 既存の処理を理解したうえで設計しなければならないのですが、 元のソースコードに対して設計書が1つもなく、 ソース、ヘッダともにコメントなし、と言う状況です。 動作環境が無いので、ソースコードを解析して動作を理解しようとしています。 しかし、やっていることが複雑でなかなか進みません。 ■ポインタ/関数ポインタの嵐で、ポインタの実体を追っていくと、  30~40階層ほど上まで見なければならない。  (関数コールに、コールバックに、メッセージのやり取り)  関数ポインタを32bit整数の変数にキャストして代入し、  整数から関数ポインタに直したりしている。 ■構造体のメンバに他の構造体へのポインタがあり、  さらにその構造体は他の構造体のポインタを持っていて、  そのポインタが他の構造体の・・ などなど。 こういう複雑な他人のコードをどういう風に解析していますでしょうか? ご教授願います。

みんなの回答

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.6

>早速印刷してみます。 できれば、既に解析の終了している所の記入。 インデント等の整形 ヘッダ部等で、コメントを入れる必要がある箇所には 空のコメント行を入れてからリスト出力しておいた方が 解析及び手書きコメントが入れ易くなります。

postal0x02
質問者

お礼

回答ありがとうございます。 気をつけるようにいたします。

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.5

設計書やコメントが無いプログラムがどれほどはた迷惑な ものか、良く実感できたと思います。 短いプログラムであれば、コメント無しでも大丈夫かもしれ ません。 しかし、長いプログラムで同じ事をした時、全ての処理内容 を記憶に留めておくことができなくなる限界が訪れます。 そうなってくると、記憶もれや勘違い、前に作成したソース リストを読み直して内容の把握し直し等が頻発して作業効率 も落ちてきます。 日程の遅れを意識しはじめると、焦りも加わって頭の中は さらに混乱。 他の人に手伝ってもらおうとしても仕様の内容は、全て自分 の頭の中だけ.... 自分だけでするしか方法は無いと、自分自身を追い込んで 結局は、どうにもならずに逃走。 #メモリ(記憶力)不足でOSがパニックを起こした。 自分はコメントが無くてもソースリストを見れば判るから 、忙しい・面倒だからといった理由でコメントを入れよう としない人は結構います。 #特に自分の能力・記憶力に自信を持っている人は、その #傾向が高いようなので注意が必要です。

postal0x02
質問者

お礼

回答ありがとうございます。 まさに仰るとおりです。 コメント、仕様書/設計書がないことが どれほどの事か分かりました。 >#特に自分の能力・記憶力に自信を持っている人は この文から少し考えましたが、 能力のある人 = 能力に自信のある人 とはならないのも実感しました。 前のプロジェクトは1人で大量にソースコードをいじっている人がいましたが、 1行1コメント、宣言、関数の実体にもびっしりとコメントが 書かれていたので多少コードが汚くても読めました。

回答No.4

Visual Studio使ってるなら、ctrl - を使うと便利だよ。 あと、インデントはCtrl A + Alt F8で全部自動でやってくれます。 で、もし自分ならこうしています。 ・ ソースコードにコメントをつける 分かったところに徹底的にコメントを付けていきます。 ・ ドキュメントの作成 他の人も書かれていますが、doxygenでも使ってさっさと生成するのがよろしいかと。 ・ 処理フロー解析 処理を手作業で、フローにしてみてください。流れがつかめないと何も分かりません。 ・プログラムの意味、作った人の気持ち(思想)を考える プログラムがどういう意図で作られたか、作った人は何故そういう構造にしたか、 それの理解に勤めます。 ・誰か知ってる人に聞く 本当はコレが一番早いと思う。 ・上司に「出来ません♪助けてください♪」という さっぱり分からないなら早めに相談したほうがいいと思う。 複雑なプログラム+コメントなし・・ 大変だとは思いますが、がんばってください。

postal0x02
質問者

お礼

回答ありがとうございます。 >Ctrl A + Alt F8で こんな便利な機能があったとは、知りませんでした。 >で、もし自分ならこうしています。 早速自分もやってみようと思います。 >誰か知ってる人に聞く 残念ながらいません。開発者は開発途中で辞めた(逃げた)らしいです。 >上司に「出来ません♪助けてください♪」という 上司も懸命に解析してます。

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.3

そのCのコードがはたしてソースなのか。 なんかのジェネレーター出力のようにも見えますが。

postal0x02
質問者

お礼

回答ありがとうございます。 Cのソースではありますが・・・ 確かに機械的に書かれたようなコードです。 ・仕様書/設計書が無い ・インデントが「タブ」では無く「スペース2個」 ・コメントのテンプレートが1文字もずれていない /* \ ******************************************/ 型 関数名(引数);  このコメントが関数の宣言に全てついています。  しかし、テンプレだけでの説明はありません。 ・どう考えても管理し辛い  かなり似た名前がゴロゴロあり、  ファイル名や、関数名が1文字だけ違ったりもしています。 ・ポインタの指す構造体が持つポインタが指す構造体が持つ関数ポイン タに渡しているunsigned intにキャストされた関数ポインタを持つ構造 体のポインタの・・以下略  実体に行くまでかなり辿らなければならないです。 最後のポインタ・構造体の嵐に引っかかっている状況です。

noname#82346
noname#82346
回答No.2

手軽なところでは doxygen みたいなドキュメンテーションツールを使って、該当ソースファイル群のドキュメント文書を出力させると良いでしょう。 その際、出力させる情報をオプションでいろいろ制御できますので、各関数から呼び出している関数のリストであるとか、関数のソースも一緒に出力するとかすれば、呼び出されている関数にリンクをたどって飛んでいったりできるので、エディタ上で大量のソースファイルを追跡するよりは効率がよいと思います。 関数ポインタを使われると追跡するのが俄然面倒くさくなりますが、それはいたしかたないところです。

postal0x02
質問者

お礼

回答ありがとうございます。 早速使ってみましたが、設定が悪いのかモジュールの関係が 実際のソースから読み取れる関係と大きくずれていました。 関数のリンクへ飛ぶのはソースを見る目的だけにVisualStudioを 使っているので問題ないのですが、リンクをたどって10回くらい 辿ると元の場所を忘れて戻ってこれなくなります。 doxygen自体は便利そうですね。 自分がソース書いたときに使ってみます。 ちなみに普通の関数呼び出しよりも 関数ポインタで呼び出してる箇所が多いです。 あとメッセージのやり取りもやたら多いです。 (追うだけで日が暮れます)

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.1

>こういう複雑な他人のコードをどういう風に解析 >していますでしょうか? 最初の内はソースファイル単位又はモジュール単位で 大まかな流れを掴んでいって、次第に仕様設計(変更) に関連する所を中心に細かい部分の解析に進みます。 コメントが無い事で、理解が難しいのであれば、解析 した所から順にコメントを入れていけば良いのでは? 既存のソースにコメント等の追加・修正できないので あれば、別途コピーするなり、リスト印字して紙上で コメントをつければ良いと思います。 #(複数の色を用途毎に使い分けて見易くする) それと、画面上だけで追うと、あちらこちらと画面を スクロールしているうちに、今どの辺を見ているのか 混乱する元にもなります。 #同じ様な処理があちこちに点在している様な場合など #特に。 その上、解析した内容をずっと頭の中に記憶しておく 必要がありますが、電話等他の作業が割込んできたり する事も多く維持するのは大変ですし、のんびり休憩 をとっていると忘れてしまう恐れもあり気を休める暇 さえありません。 リスト上で作業をすると、紙の上に作業経過が残るので 今見ているリストの範囲だけに集中する事できますし、 例え割り込みが有ってもすぐに元に作業に戻れます。 休憩時間や帰宅の際にも仕事以外の事を安心して考える 事ができ、ストレスを減らす事にも役立ちます。 #人間の脳は気軽にCPU交換やメモリ増設して、機能UP #する事はできません。 #それなら、メモリの内容を外部メモリにスワップして #リソース不足による負担を減らすのも1つの案

postal0x02
質問者

お礼

回答ありがとうございます。 早速印刷してみます。 ソースコード自体は書き換えできます。 というより何故かインデントが スペース2個 なので タブに置き換えないと見れたものではないです。

関連するQ&A

  • C言語のソース解析ツールありませんか

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

  • c言語についてです。

    以下の条件で課題が出ました。 どなたか詳しい方いらっしゃいましたら回答お願いします。 1.main関数のほかに最低3つの関数を用いる。 2.構造体を使用すること 3.ステップ数は最低50ステップ以上 4.少なくとも1度はポインタを使用する処理を盛り込むこと プログラム動作内容を説明するドキュメントをつくる ソースファイルおよびコンパイル後の実行可能なファイルをつくる

  • c言語についてです。

    以下の条件で課題が出ました。 1.main関数のほかに最低3つの関数を用いる。 2.構造体を使用すること 3.ステップ数は最低50ステップ以上 4.少なくとも1度はポインタを使用する処理を盛り込むこと プログラム動作内容を説明するドキュメントをつくる ソースファイルおよびコンパイル後の実行可能なファイルをつくる 以上の条件をみたすプログラミングの詳しい回答よろしくお願い致します。

  • 安価なソースコードの構造解析ツール

    Imagix4D(http://www.toyo.co.jp/ss/imagix/index.html )みたいな リバースエンジニアリングツールでフリーもしくは安価なものはない でしょうか? 目的は、C/C++ソースコードの構造解析です。 よろしくお願いします。

  • c言語について教えて下さい

    知り合いのコードを解析していたときのことです。 彼のコードにはマクロはあまり多くなく、構造体や列挙型を使用していました。 コードの書き方は人それぞれではありますが、マクロで一つずつ定数などを扱うよりも、一つのグループとして構造体や列挙型を使い扱ったほうがよいのでしょうか、教えてください。 また、話は変わるのですが、構造体と列挙型の違いを教えてください。調べたのですがいまいちわかりません(・・;) よろしくお願いします。

  • ソースコードを読んだら、どう活かせばよいか

    今オープンソースのコードを読んで自分のプログラムの設計やアルゴリズムの参考にしているんですが、 それが頭にあるせいか、どうしても似た構造になってしまいます。 無理して独自性を追及する必要は無いと思うのですが、今後どうしたらよいでしょうか?

  • C言語のvoid型ポインタを使いたいのですが…

    C言語のvoid型ポインタを使いたいのですが… 関数の引数として、void型ポインタを使おうと思ったのですが、内部でどのように処理すればいいのかわかりません キャストすれば問題なく使えるとのことですが、どの型でキャストするのかをどのように判断するのかがわかりません 具体的には、画像処理で画像の構造体をいくつか作ったのですが、それぞれの構造体ごとに関数を書くと関数が多くなるので、void型ポインタでまとめてつくろうとしています どのように型の判断を行えばいいのかを教えてください

  • ソースコードを効率よく読むには

    私はソースコードを読む際、とりあえずmain関数の先頭から読んでいき、知らない関数に出会った時はその都度調べて、、、というスタンダードというか単純なやり方でコードを読んでおりますがもっと効率よくソースコードを理解する方法はないかと思っております。 皆さんにお聞きしたいのですが、ソースコードを読む際の工夫していることや、便利なツールなどがあれば教えていただきたいです。 どうぞよろしくお願いします。

  • ソースコードの読み方

    ソースコードの読み方 いま基幹システムのプログラム開発の仕事をしてるんですが、 今度の仕事ではソースコードを読んで、 プログラム全体を理解することが求められてます。 で、質問なんですが、ソースコードと詳細設計書を読んで そのプログラムの一個一個の処理とその目的を、 完全に理解するにはどうすれば良いでしょう? いま現場にはそのシステムの設計についての知識のある人はおらず、 (したがって人に聞くことは出来ない。) 前任者から一切の引継ぎを行えず、 手元の資料はあくまでソースコードと詳細設計書のみです。 おまけに、この作業担当を一人でやらなければなりません。 したがって、 ソースコード解読のノウハウを伝授して頂きたいです。 いまのところ、ソースコードの処理の流れ自体は プログラムの概要説明等からなんとなく掴めるのだが、 (そんなの当然ですが) ある一つの処理について、 その処理をしたところでそれがどんな要件を満たしているのか? ってことがわからないことがよくあります。 例えば、いま見てるプログラムでは、 タイムスタンプのためのテーブルを読み込んで、 処理の制御をするといった事があるのですが、 いまの能力だとそのテーブルの時刻が、 何を意味しているのか掴む事が出来ないとか、 そういうこまごましたナゾが沢山あって、それらが積み重なって、 プログラムに対する理解というのが不完全なものとなっています。 コーディングの技術的な事柄に関しては、 ほかの現場にいる先輩に聞いてみたり、 何とか書物等で問題を解決するものという前提で、 どのようにすればプログラムの詳細な業務要件を掴む事が出来るか というところまわりをご教示頂けると幸いです。 回答をお待ちしています。 よろしくお願いします。

  • C言語

    よろしくお願いします。  下記の構造体タグ「seiseki」を使って,表に示すデータをもつ構造体配列「list」を作成する.  関数に構造体配列「list」のアドレスを渡す.  関数で構造体ポインタ「*list」を利用して,一番点 数の高い者(1名限定)を調べ,その名前を表示する. struct seiseki{ char name[30]; int score; name score }; 表 佐藤 80 鈴木 75 田中 95 高橋 90

専門家に質問してみよう