質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

3407閲覧

ロジック内の関数や関数内で使用しているグローバルなどの解析を行うプログラムを作成したいのですが。。。

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/12/13 14:46

編集2017/12/13 15:04

業務で、ロジック内の関数や、その関数が使用しているグローバル変数などを洗い出し、分析する必要があります。

例えば、Eclipseのコードリーディング機能のように、統合環境の機能を使えば、関数の一覧を出したり、関数の階層や使用しているグローバル変数などを見ることは出来ますが、そういった情報をもっと自由自在にExcelにまとめ、テスト仕様書や関数仕様書作成を自由自在に作れるようになりたいのです。

その為には、Cのコンパイラが変数内からどのように関数や変数を識別しているのか?

または、Eclipseなどの統合環境がどのように関数の階層を分析して階層表示させているのか、その具体的なロジックを知りたいと思っています。

その為に一体どこから手を付けたらいいのやらという感じです。。。

CコンパイラやEclipseなどがどのように関数や変数を判別しているのか?

それを知るのに何かいい方法は無いものでしょうか?

ごちゃごちゃ書きましたが、まずは、

「Cプログラムの中から、関数一覧を抽出してエクセルに吐き出す」

というVBAを組んでみたいと思います。

それには、どうしたらいいのでしょう?

C言語のプログラムの中で関数かそうでないかを判定するにはどうしたらいいのでしょうか?

まずはC言語の正しい仕様を理解するところからですね。

C言語の正しい仕様はどうしたらてにいれられれるのでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

こんにちは。

Cコンパイラは構文解析してます。構文解析器を作ればできます。
第1回:かんたん構文解析入門」という記事がありました。なかなかハードな印象です。

can110さんが紹介されているDoxygenは、ソースコードを構文解析し、さらにDoxygenの約束に従ってコメントを付けることでドキュメント化してくれます。clangコンパイラの構文解析ライブラリのドキュメントはDoxygenで作られています。
Doxyenにソースコードをぶち込んだだけでも、ある程度解析してくれますし、有用ではないかと思います。
恐らく現実的な線と思います。

clangで関数呼び出しを抜き出す」は、上記clangコンパイラの構文解析ライブラリ(libTooling)を使って関数リストを抜き出す記事です。
このlibToolingを使いこなせると、この手の目的のためには非常に有用です。FunctionDeclが関数、VarDeclが変数です。C言語なら、この2つから辿ればそこそこ解析出来るはずです。
libToolingの使いこなしもそこそこハードですが、もし、コンパイラ周辺に興味があるのならばこれを使いこなすと結構強みになると思います。(緩いライセンスなのでかなり自由に使えますし。)

投稿2017/12/13 15:30

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/17 02:26

Chironian様 ご回答ありがとうございます。 これは参考になりますね! libToolingを使いこなすのは、ハードル低くはないですが、やって出来ないこともなさそうですね。 ありがとうございます!
guest

0

まずとっかかりとしてDoxygenCppcheckなどの静的コード解析ツールのソースコードが参考になるかと思います。

投稿2017/12/13 14:53

編集2017/12/13 14:56
can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/13 15:11

can110様 ご解答ありがとうございます! あ、静的コード解析ツールですか!なるほど! DoxygenやCppcheckなどの静的コード解析ツールを改造して、好きなように出力できればいいなぁ。。。 DoxygenやCppcheckはコードを見れたりいじれたりするものなのでしょうか?
退会済みユーザー

退会済みユーザー

2017/12/17 02:22

t_masa様 ご回答ありがとうございます! なるほど。 これで、時間さえかければなんとかなるという事ですね。。。 でも、確かにハードルは相当高そう。。。
guest

0

どのように関数や変数を識別しているのか?

その具体的なロジックを知りたいと思っています
その為に一体どこから手を付けたらいいのやらという感じです

他の回答者の方々が仰るように、
ツールを利用するのが、現実的な選択肢だと思います。

でも、原理的な話もしておきます。


静的解析は、
インタプリタコンパイラなど、
言語処理系の知識があるとできます。

それには、構文解析はもちろん、
オートマトンBNFなどが関係してきます。

紙幅の関係で思いっきり単純化した話をすると、結局は、
文字列を読み込んで、IF文で分岐させればできます

もちろん、パーサコンビネータのように、
もっと洗練されたやり方はありますが。

一番抽象化した基礎の基礎は、記号による状態遷移です。


具体的なロジックを言っていくと、
(インタプリタなどが)Cのコードを文字列として読み込んで、
もし、「if」とか「for」とかの単語を見たら、
予約語になってるので、それに応じた処理をします。

もし、「abc」のような未知の単語に遭遇したときに、
文法知識を使って、変数か関数の宣言かどうか判断します。
関数ならカッコがついているとかです。
そして、一度出た単語は記憶しておき、関数の呼び出しなどに対応します。

もちろん、実用的な構文解析では、構文木を構築するとか、
変数がグローバルかローカルを判定するなら、スコープを処理するとか、
細かい部分がいろいろありますが、一番基本は単語で分岐させることです。

なお、インタプリタやコンパイラを作るのではなく、静的解析だけなら、
処理を省略できる部分もあるでしょう。
たとえば、C言語ならプロトタイプ宣言だけ見ても、かなり情報があるし。

ただ結局、静的解析も、別のタイプの構文解析です。
複雑になると言語処理に近づいていきます。


C言語の正しい仕様を理解するところ

JISC 日本工業標準調査会

C言語はANSIJISなどで規格化されているので、
規格の情報を入手すれば、言語仕様は分かります。

The syntax of C in Backus-Naur form(Western Michigan University)

ただ実際には、規格そのままだと実装で使いにくいので、
実装上はBNF(上記は一部だけだが参考に)を使います。

しかし、自力で一から構文解析するのは、
一番正攻法ではありますが、率直に言って、
非常に難解な領域でもあります。少なくとも、初心者向けではありません。

だから、実用上はツールを使いつつ、もし使うだけでは満足できないなら、
長い時間を掛けて、少しずつ正攻法の構文解析も、
並行して学んでいくことになると思います。

投稿2017/12/14 12:38

LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/17 02:38

LLman様 非常に詳しい解説をありがとうございます。 そうですね。 他の方の回答にもありましたが、 最初はclangやctagsのツールを使うところから勉強してみようと思います。 ありがとうございました。
guest

0

業務利用ならばUnderstandなどを購入するのをお勧めします。

ソースコードを直接解析するのは中々痺れるので、簡易的でよければctagsでタグファイルを作ってそれをVBAから加工してはどうでしょうか?
関数やグローバル変数の一覧ぐらいだったらこれでいいかもしれません。

被参照関係の解析は工夫が必要そうですが・・・。

投稿2017/12/13 18:49

TaroToyotomi

総合スコア1430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/17 02:33

TaroToyotomi様 ctags、ちょっと見てみましたが、これを使いこなせればなんとかなるかもしれません。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問