Soot フレームワークを使用して構築するコールグラフを使用して、いくつかの依存関係分析を実行しようとしています。「ポイントツー」分析を使用するとコールグラフの精度が向上するというガイドを読みました。「ポイント先」分析とは正確には何ですか?また、コールグラフの精度をどのように向上させることができますか?
1 に答える
データ フローを理解する上で重要な問題は、各ポインターが参照できる日付を知ることです。オブジェクトへのポインターについて何も知らず、そのオブジェクトがポインターを介して更新される場合 (たとえば、p.=3)、システム全体の任意のオブジェクトが変更される可能性があります。p が特定のオブジェクト O1 を参照していることがわかっている場合、O1 のみが変更される可能性があることがわかります。したがって、 p が何を指し示すことができるかについての知識は、副作用とそのような効果の範囲を理解する上で重要です。
ここで、関数へのポインタがあるとします。関数ポインタ p が何を指すかがわからず、関数呼び出しが p を介して間接的に行われる場合、任意の関数が呼び出される可能性があり、副作用は任意の関数からの副作用である可能性があります。p が foo のみを指すことができることがわかっている場合、foo が引き起こす可能性のある副作用のみが発生する可能性があります。
コール グラフを計算するとき、一部の関数呼び出しは明らかに 1 つの場所にしか行きません。一部の関数呼び出しは、実際にはポインターを介した関数呼び出しであるため、さまざまな場所に行くことができます。オブジェクト指向言語での「メソッド」呼び出しは、多くの場合、このようなものであり、ポリモーフィズムをサポートするために意図的に行われます。
ポイントツー分析を行わなければ、おそらく関数ポインタ ポイントツー分析を行うことはできません。つまり、構築されたコール グラフは、ノード バーがそのポインター p を介して多くの可能な関数を呼び出す可能性があることを示しています。これは、心配しなければならない多くの副作用があることを意味します。
正確なポイントツー分析は、正確な関数ポイント分析につながり、それは正確な副作用分析につながり、コードができることのより良い理解につながります。もちろん、精度は相対的です。また、「非常に正確な」ポイントを分析するのが難しくなります。限界では、完全な分析ポイントを取得することは不可能です。あなたはチューリングマシンを分析しています。
http://www.semdesigns.com/Products/DMS/FlowAnalysis.htmlで、フロー分析の詳細と「より正確な」コール グラフの例を参照できます。