Atlasの力を引き出す (5): 制御フローとデータフロー
Atlas がコードベースをインデックスするときに制御フローとデータフローが保存され、いくつかのクエリでそのいずれかを取得できます。
これまでの記事では、Atlas でコードベースをインポートする方法を学ぶことから始め、Smart Views と Atlas Shell を詳しく見て、Atlas クエリ言語を調べました。ここからは、これらのツールを具体的な解析作業に適用します。まずは、基盤となる解析である制御フローとデータフローから始めます。
制御フローとデータフローは、ソフトウェア解析の基盤となる概念であり、Frances Allen が最初に導入しました。これらの概念は、さまざまな種類のソフトウェア解析に不可欠で、コードの振る舞いと構造を理解するのに役立ちます。Atlas では、この重要な情報を容易に抽出でき、さらに、内容をよりよく把握するための見やすい視覚的表現も得られます。Atlas がこの処理をどのように簡潔にし、これらの解析をさらに強力にするかを見ていきます。
Atlas における制御フロー
Atlas でコードベースをインデックスすると、ソフトウェア全体の制御フロー情報が自動的に作成され、保存されます。Atlas でコードベースをインデックスする手順については、以前の記事をご覧下さい。
Atlas は、コードベース内のすべてのプログラム文に対してノードを生成します。これらのノードは、Atlas のグラフデータベース内で「XCSG.ControlFlow_Node」の下に分類されます。つまり、クエリ G.nodes(XCSG.ControlFlow_Node) を実行すると、与えられたグラフ G に存在するすべての制御フローノードの一覧が得られます。これは、ソフトウェアの制御フローの構造を可視化し、操作するための、簡潔でありながら強力な方法です。
制御フロー情報は、Allen が提案した後続関係についてのものです。ある文が与えられたときに、次に実行される 1 つ以上の文を定義します。Atlas は、これを制御フローノード間のエッジで表します。これらのエッジは「XCSG.ControlFlow_Edge」として分類されます。
制御フローを解析するときは、通常、特定の関数またはメソッドに注目します。幸い、Atlas ではわずか数個のクエリでこの情報を取得できます。手順は次のとおりです。
var f = functions(<name>)
var g = cfg(f)
show(f)さらに、これをその場で行うため、Atlas には制御フロー解析用の Smart View も備わっています。(Smart Views に関する記事をご覧下さい)。
Atlas におけるデータフロー
制御フローと同様に、Atlas はコードベースをインデックスするときに、データフローの関係も計算します。データフローに関わるノードとエッジの、グラフデータベースのキーは、それぞれ XCSG.DataFlow_Node と XCSG.DataFlow_Edge です。
Atlas はさらに一歩進んで、その場で手軽にデータフローを解析できる Smart View を提供します。この機能により、データがコードの中をどのように移動するかを調べやすくなり、少ない手間で、より深い知見が得られます。
多くの場合、制御フロー情報とデータフロー情報との対応を確立することが重要です。Atlas は、制御フローとデータフローの両方を包含関係の中に整理することでこれを可能にし、両者を途切れなくつなぎます。各変数は、データフローノードとして表されます。実際の動作を示すため、Atlas がこれらの関係をどのように管理し、解析をどのように高められるかを、このあと詳しく見ます。
たとえば、プログラム文 percussion = instruments + i + 1; では、Atlas は、変数に対応するデータフローノードを、そのプログラム文に対応する制御フローノードの中に「包含」されるものとして表します。下の図をご覧下さい。

制御フローノードも、同様に関数ノードに包含されます。クエリ children() は、あるノードに直接包含されるノードを取得します。関数ノードに対しては、その関数ノード内の制御フローノードを返し、制御フローノードに対しては、その中に包含されるデータフローノードを返します。なお、グローバル変数の定義を表すデータフローノードは、プログラム文の中には包含されません。
Atlas は、制御フローとデータフローを非常に柔軟な形で整理しているため、強力な クエリ言語を使って、より高度な解析を容易に行えます。この柔軟性により、弊社は DARPA のプロジェクト向けに、ループ検出、スライシング、コードスメルの特定といった作業のためのカスタムアナライザを構築できました。Atlas の制御フローとデータフローで自分専用の解析ツールボックスを構築することは、興味深い話題です。弊社では、今後の記事で詳しく取り上げる予定です。Atlas を使って、ご自身の解析ニーズに合わせたツールを作る方法について、詳しい解説をお待ちください。
次: 呼び出しグラフ
ご質問、または修正のご希望はありますか?
ありがとうございます。
このページについての内容を受け取りました。
