Cソースコードからプログラム依存グラフ(PDG)を生成します。私はどのようにそれを説明する論文を見つけましたが、すべて商用のCodeSurferツールを使用しました。無料ツールを使用して、Cコードのプログラム依存グラフを生成できます。
このジョブを実行できる無料のツールやオープンソースプロジェクトはありますか?
Cソースコードからプログラム依存グラフ(PDG)を生成します。私はどのようにそれを説明する論文を見つけましたが、すべて商用のCodeSurferツールを使用しました。無料ツールを使用して、Cコードのプログラム依存グラフを生成できます。
このジョブを実行できる無料のツールやオープンソースプロジェクトはありますか?
Frama-Cは、プログラム依存グラフの計算に基づくa slicer for C programsのオープンソース静的解析プラットフォームです。
Cのような実際のプログラミング言語で書かれた実際のプログラムをスライスすることは、多くの特殊なケースや概念が科学的な出版物では見過ごされることに注意してください。それでも、私はあなたがFrama-CのPDG計算より簡単なものは見つけられないことを確信しています。なぜなら、それは唯一のオープンソースの1つであり(私が知っている)、第2に、Cプログラムを扱う他のPDG計算は、同じ問題を解決し、同じ概念を導入する。
int a, b, d, *p;
int f (int x) {
return a + x;
}
int main (int c, char **v) {
p = &b;
a = 1;
*p = 2;
d = 3;
c = f(b);
}
コマンドframa-c -pdg -dot-pdg graph -pdg-print t.c
それぞれmain()
とf()
のPDGを含むドットファイルgraph.main.dot
とgraph.f.dot
を生成する:ここ
は一例です。
あなたは、このようにそれらのいずれかのプリティプリントにdot
プログラムを使用することができます。dot -Tpdf graph.main.dot > graph.pdf
結果は以下の通りです:
は、ノード*p = 2;
へのノードc = f(b);
からエッジに注意してください。 Cプログラムにとって有益であると主張するPDG計算は、エイリアシングを処理しなければならない。
一方、基準「文c = f(b);
の入力」にスライスし、このPDGを使用してスライサーでもポインタアクセス*p
を通じて、関数呼び出しに影響を与えることができないd = 3;
を、取り除くことができるでしょう。 Frama-Cのスライサーは、PDGで指定された依存関係を使用して、ユーザー指定のスライシング基準に役立つステートメントのみを保持します。例えば、コマンドframa-c -slice-wr c t.c -then-on 'Slicing export' -print
はd
への割り当てが削除された以下に低減プログラムを生成する:
/* Generated by Frama-C */
int a;
int b;
int *p;
int f_slice_1(int x)
{
int __retres;
__retres = a + x;
return (__retres);
}
void main(int c)
{
p = & b;
a = 1;
*p = 2;
c = f_slice_1(b);
return;
}
gcc
を使用しているメソッドの依存関係を視覚化したい場合は、gcc
のオプション-fdump-rtl-expand
が役に立ちます。
オプションファイル-fdump-rtl-expand
gcc
を使用してコンパイルした各ソースファイルに対して、*.expand
ファイルを出力します。
ツールに入力されたファイルegyptは、メソッドの依存関係を示すグラフを生成します。
A PDGは、そのノードの文であるグラフです。たとえば、http://www.grammatech.com/research/papers/slicing/slicingWhitepaper.htmlを参照してください。 –
あなたの注目すべき助けに感謝します。私はFrama-Cの使い方を学び始めています。 Frama-Cのリファレンスでは、graph.main.dotグラフのラインのミーナニングを見つけることができません。さまざまな線のスタイルは何を意味しますか?またはこれに関する資料があります。 – user1283336
@ user1283336 3種類の矢印があります:それぞれデータ、制御、アドレスの依存関係です。プログラム 'int a、b、* p; ボイドメイン(int型のx、int型のY、int型Z) {p =&。 * p = x; if(y) b = z; } 'には3種類の依存関係がすべて含まれています。最初の例と同じコマンドラインを使用すると、どちらがどちらであるかを認識するのが難しくなりません。スライサーの内部についてユーザーが利用できる説明はありません。申し訳ありませんが、スライサーの使用方法の外部説明のみです。 –
'-dot-pdg'ではなく-pdg-dotでなければならないと思いますか?少なくとも私にとっては前者の方法でしか働かなかった – Paddre