2012-04-13 8 views
8

次の各例と同様のコードで、静的解析を行い、SpecialFunction()に渡す可能な値のリストを調べることができます。静的解析、変数/パラメータの可能な値

SpecialFunction(5); // A 

int x = 5; 
SpecialFunction(x); // B 

int x = 5; 
x = condition ? 3 : 19; 
SpecialFunction(x); // C 

私はすでに、抽象構文木へのC#を解析することができますし、私はすでにAのようなケースを扱うことができる、と私はケースBを推測するための値の初期割り当てを追跡することができると思いますが、Cのような例として簡単にすぐに複雑になるようです。

私は、すべての場合においてxを静的に解くことはできないと確信していますが、それは問題ありません。それを試みる戦略、それができない時を認識する方法を知りたい。クラスレベルのフィールドとマルチスレッドを含める必要がある場合はどうすればよいですか?閉鎖? x|X| < 50のすべての可能な値のセットXを知っていれば助けになるでしょうか?

@Vladimir Perevalovの提案から、Pexの考え方は、Pxがコードパスと値を発見してにチェックを入れない(?)ではなく、対象となるコードポイントの可能な値を見つけるのにどのように適用できるか?例外的な場合)?

+1

+1。指定されたパラメータ値の範囲の失敗/成功の可能性を推測することは、静的解析の「義務」とは考えないでください。これは、おそらく「動的解析」の「義務」です。しかし、たとえそうであっても、この* *のケースではパラメータの*カップル*のみを扱いますが、関数を扱うと、IEnumerable GetValuesForx(...) '? – Tigran

+0

@Tigran - プログラム(またはフラグメント)の実行またはシミュレーションはオプションではありません。また、静的解析で答えが得られるケースもありますが、明らかにそうではないケースもあります。私は可能な場合を特定して達成しようとしています。 –

答えて

3

あなたが望む(少なくとも非常に近い)プロジェクトがあります。それはPexです。 自分のドキュメントを見てみると、ソースを逆コンパイルして、自分が行っていることを見ることもできます。

+0

良いアイデア、Pexを考慮していなかった。ペックスは唯一のものですか? Pexよりも小さいものはありますか? –

+0

私は本当に似たようなことをする他のツールについては知らない。 –

+0

"ソースコード[オブジェクトコード?]を逆コンパイルして、それらが何をしているのかを確認してください。" i "オブジェクトコード"を意味し、これを真剣に意味するならば、あなたは単に狂っているだけです。これは難しい問題であり、誰かの洗練されたソリューションをリバースエンジニアリングするのが最後の試みだと思うのです。 –

3

グローバルデータフロー分析(「どの値割り当て/副作用がどの利用ポイントに達するか」)[制御フロー分析を前提として必要とする]と何らかの範囲分析(「一連のポイントに達することができる値 ")。

データフローをコンピューティングするには、C#フロントエンド、ローカル制御およびデータフローの分析が必要であり、これらの回答をまとめてグローバルデータフロー分析に組み込む必要があります。

範囲分析では、まず、可能な値のセットをどのようにエンコードするかを定義する必要があります。どのような仕様のシステムが許可されていますか?最も単純な、値のセットは、爆発する傾向があります。中間仕様スキームは、OPの単一のリレーショナルと定数とのようなものであり、例えば「x < 50」である。そのような制限されたスキームの問題は、値の集合が豊富なために、特に興味のある述語がある場合に無用な答えが得られる可能性があるということです(xが常に奇数の場合、単一リレーショナルから定数へは"x < infinity"としては明らかに役に立たないので、興味のある値の種類をモデル化するのに十分複雑な仕様スキームを選択したいと思っていますが、仕様スキームがより洗練されるにつれて、

ほとんどの分析ツールは、このような分析はありませんが、あなたにあなたに公開されることはありません。

私たちのDMS Software Reengineering Toolkitは、一般的な解析、シンボルテーブル構築、制御/データフロー解析、実際には範囲分析機械(仕様:x < k1 * a + k2 * b、k1とk2は定数、aとbは他のプログラム変数です。 xが消費される)。 DMSはC#、Java、GNU C、COBOLのフロントエンドを持っています。これらの言語に固有の事実を集め(静的解析!)、これらを供給することで、GNU CとIBM Enterprise COBOL一般的な機械に事実。私たちはこの機械をC#のためにインスタンス化していません。しかし、あなたが別の情報源から良い答えを得ることができないなら、これはかなり近いと思われます。

+0

興味深いトピック –

+0

私はMSR Roslynでかなり遠くになることができました。私はそれをASTに構文解析するだけで使用し、多大な労力を要することなく自分の(欠陥のある)推論を行なった。私はRoslynが私のためにもっとや​​ることができると思うが、それはうまく文書化されていない。それは概念証明のためには十分でした。このプロジェクトが進めば、あなたの会社に確認するかもしれません。 –

+0

私はRoslynがほとんどグローバルフロー分析をしていないと思います。私が理解しているように、C#は主にJITコンパイラです。 –

関連する問題