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

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

ただいまの
回答率

90.33%

  • C

    3991questions

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

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 937

ogura87

score 96

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+4

こんにちは。

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/17 11:26

    Chironian様

    ご回答ありがとうございます。
    これは参考になりますね!

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

    キャンセル

+3

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/14 00:11

    can110様

    ご解答ありがとうございます!
    あ、静的コード解析ツールですか!なるほど!

    DoxygenやCppcheckなどの静的コード解析ツールを改造して、好きなように出力できればいいなぁ。。。

    DoxygenやCppcheckはコードを見れたりいじれたりするものなのでしょうか?

    キャンセル

  • 2017/12/14 11:14

    横からになりますが。
    DoxygenもCppCheckもソースコードがgithubにあります。

    https://github.com/doxygen/doxygen
    https://github.com/danmar/cppcheck

    Doxygenは字句解析にはflex使ってるので、いじるなら最低限そのあたりの知識は必要です。
    以下のコードが字句解析のソース(の一例)です。

    https://github.com/doxygen/doxygen/blob/master/src/scanner.l

    キャンセル

  • 2017/12/17 11:22

    t_masa様

    ご回答ありがとうございます!
    なるほど。

    これで、時間さえかければなんとかなるという事ですね。。。

    でも、確かにハードルは相当高そう。。。

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/17 11:33

    TaroToyotomi様

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

    キャンセル

+1

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

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

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


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

それには、構文解析はもちろん、
オートマトン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/17 11:38

    LLman様

    非常に詳しい解説をありがとうございます。
    そうですね。

    他の方の回答にもありましたが、
    最初はclangやctagsのツールを使うところから勉強してみようと思います。

    ありがとうございました。

    キャンセル

同じタグがついた質問を見る

  • C

    3991questions

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

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