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、それを知っていれば役に立ちます|X| < 50か?

@Vladimir Perevalov の提案から、Pex の概念を、対象のコード ポイントの可能な値を見つけるためにどのように適用できますか (チェックされていない (?)例外的なケースにつながるコード パスと値を検出するという Pex のように思われることではなく) ?

4

1 に答える 1

4

必要なのは、グローバルデータフロー分析(「どの値の割り当て/副作用がどの使用ポイントに到達するか」)[前兆として制御フロー分析が必要]とある種の範囲分析(「到達できる値のセットを要約する」)の両方です。点数")。

データフローを計算するには、完全なC#フロントエンド、ローカルコントロール、およびデータフロー分析を行い、それらの回答をまとめてグローバルデータフロー分析にする必要があります。

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

ほとんどの場合、利用可能な分析ツールにはそのような分析はありません。ましてや、あなたに公開されていることは言うまでもありません。PEXは確かにそのような機械を持っているかもしれません。運が良ければそれも公開されます。

DMS Software Reengineering Toolkitには、一般的な解析、シンボルテーブルの構築、制御/データフロー分析、さらには範囲分析機構があります(仕様:x <k1 * a + k2 * bここで、k1とk2は定数、aとbは他のプログラム変数です) xが消費される場所で表示されます)。DMSにはC#、Java、GNU C、およびCOBOLフロントエンドがあり、実際には、これらの言語に固有のファクトを収集(静的分析!)し、これらをフィードすることにより、GNUCおよびIBMEnterprise COBOL(および部分的にJava 7)用にこの機構をインスタンス化しました。一般的な機械への事実。この機械はまだC#用にインスタンス化されていません。しかし、別のソースから良い答えを得ることができない場合、これはおそらくかなり近いです。

于 2012-04-13T23:13:35.617 に答える