• 締切済み

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