8

ソース コードからCFG ( Control F low G raph )を自動的に生成する方法があることは知っています。ただし、私が理解していることから、これらの方法は視覚的なグラフ、つまり画像を提供します。そのような画像を使用して計算を行うことはできません。

したがって、私の質問: プログラムで解析可能なデータ構造またはファイルでソース コードが返されるように、ソース コードから CFG を自動的に生成する方法はありますか? (理想的には、CFG の各ノード/エッジの行番号にもアクセスできるようにしたい)

このような CFG を使用して制御フロー パスを抽出し、入力パス カバレッジを決定するプロジェクトにこれを使用します ( traceを使用して解決します) 。

重要: 私が分析しようとしているコードは python で書かれています。Pythonで分析を実行したい

4

3 に答える 3

3

Q: アプリケーションの制御フロー グラフを llvm インフラストラクチャで基本ブロック単位で取得することはできますか?

A: はい、BasicBlock* を指定すると、次のように CFG 内の pred/succ ブロックを反復処理できます。

#include "llvm/Support/CFG.h"

   for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) {
     BasicBlock *OnePredecessor = *PI;
     ...

後継者の場合、s/pred/succ/

Q:アプリケーションの制御フロー グラフを表示する方法はありますか?

A: はい、次を使用します: analyze -print-cfg X.(bc|ll) または: analyze -print-cfg-only X.(bc|ll)

これらは、ネットで入手できるgraphvizツールセットを使用してさまざまなグラフィック形式に変換できる「ドット」ファイルを生成します。

http://lists.cs.uiuc.edu/pipermail/llvmdev/2005-June/004416.html これは、プログラムで CFG を抽出 し、補助ツールを使用して CFG をコンソールに出力する方法を示しています。

于 2013-01-09T05:57:19.970 に答える
2

astPythonのモジュールを調べましたか。それはあなたが探しているものを正確に実行するわけではありませんが、おそらくそれを使用してより簡単にあなた自身を構築することができます。

編集コメントの質問に答えるには:

以下を保存するとtest.py

def add(a, b):
    return a + b


def mult(a, b):
    result = 0
    for i in range(b):
        result += add(result, a)
    return result

その後、

import _ast


test = compile(open('test.py').read(), 'test.py', 'exec', _ast.PyCF_ONLY_AST)

次に、Moduleクラスであり、body属性を持つテストがあります。このbody属性はモジュール内のすべてのリストであるため、この例では次のようになります。

test.body  # >>> [<_ast.FunctionDef object at 0x...>, <_ast.FunctionDef object at 0x...>]
test.body[0].name  # >>> 'add'
(test.body[0].lineno, test.body[0].col_offset)  # >>> 1, 0
test.body[0].body  # >>> [<_ast.Return object at 0x...>]

test.body[1].body  # >>> [<_ast.Assign ...>, <_ast.For ...>, <_ast.Return ...>]
# etc.

追跡するクラスを見つけて、各ステートメントに異なるクラスが関連付けられていることに注意してください。

おそらく最初に思ったほど簡単ではないでしょうが、恐ろしいことではないはずです。astまた、それを繰り返し行うには、次のような機能を持つモジュールが必要になりますiter_child_nodes

test2 = next(ast.iter_child_nodes(test))
test2 is test.body[0]
于 2013-01-09T21:21:47.920 に答える