Graphifyは11月8日、リポジトリパスを実行コードから分離し、言語別の呼び出し関係の解析を補強した新バージョンを公開した。ソースコードでどの関数がどこにつながるかを調べる開発者は、パスを介したコード実行のリスクを減らし、従来は抜けていた呼び出し関係をグラフで確認できるようになった。
1. リポジトリパスを実行コードから分離
/graphifyの実行ガイドが生成するコードブロックでは、スキャン対象のパスをPythonコードの文字列に直接埋め込まなくなった。最初の段階でパスをgraphify-out/.graphify_rootファイルに記録し、その後の解析と更新ではこのファイルを読む。
従来はパスに引用符や$(...)があると、Path('INPUT_PATH')の文字列から抜け出してコードとして実行される可能性があった。今はパスを命令ではなくアドレスデータとして扱う。リポジトリ名に含まれる文字が実行コードの一部になっていた経路を変更した。
2. 場所が変わっても同じプロジェクトのノードを維持
Pythonでインポート対象を確定できない場合に使う一時ノードの識別子は、リポジトリの場所への依存を減らした。絶対パスではなくプロジェクト内部の位置を基準とし、別のフォルダーにリポジトリを取得したりキャッシュを移したりしても同じ識別子を維持する。グラフ内の対象に付ける名札が、リポジトリのアドレス変更だけで変わっていた問題を修正した形だ。
Windowsでも同じファイルのパス表記が異なるためにキャッシュ項目が分かれていた問題を修正した。長いパスを使うリポジトリでも、ファイルの状態を記録するキーをルート基準の相対パスに保ち、移動や複製をしたコード群でキャッシュを素早く見つける方式を引き続き使う。
サブフォルダーを対象に新しく作ったグラフを古い形式と誤認していた判定も修正した。新しいグラフに不要な強制抽出の案内が出ないようにし、プロジェクト全体ではなく一部のフォルダーだけを解析する流れを補強した。
3. SolidityとC#の呼び出しを宣言に接続
Solidityでは、ブロックチェーン上で自動実行されるスマートコントラクトやインターフェース型の値を通じて関数を呼び出すと、該当する宣言につながるようになった。以下はリリースノートの例だ。トークン変数の関数呼び出しがどの宣言を指すかをグラフ上で接続している。
IERC20 token; token.transfer()using A for T指令で特定の型に付けて使うライブラリ関数と独立した関数の呼び出しも接続する。従来はこの方法で付けた関数を呼んでも、その関数まで関係がつながらなかった部分を補強した。
C#ではインスタンス・静的コンストラクターと、型宣言でパラメーターを受け取るプライマリコンストラクター、型宣言とともに定義するコンストラクターをそれぞれ独立したノードとして記録する。コンストラクター内の呼び出しをそのノードに帰属させ、オブジェクトの生成や別のコンストラクターを呼ぶコードを、引数の数が一致するコンストラクターに接続する。
プロパティとインデクサーのアクセサー、つまりプロパティの値を読み書きする部分の内部で起きる呼び出しも、該当するメンバーに接続する。インデクサーは配列のように角括弧で値を読み書きする機能だ。式形式の本体や演算子・型変換の本体内の呼び出しも記録し、通常のメソッド外で起きる呼び出しの欠落を減らした。
Solidityは対象の型が不明だったり、候補を一つに絞れなかったりすると接続を保留する。C#も引数の数が一致するコンストラクター候補が二つある場合や、基底クラスのコンストラクターを確認できない場合は、コンストラクターへの接続を追加しない。
4. 変更監視は必要な再構築に集中
監視ツールがイベントフィルターに対応していれば、読み取り専用イベントを監視対象から除き、変更イベントだけを処理する。大きなディレクトリでイベントキューが繰り返しあふれていた問題を防ぐための措置だ。
監視中にグラフファイルがなければ、一部の情報だけで不完全なグラフを作らず、全体を再構築する。JavaScript・TypeScriptのインポートパスを決定する設定ファイルやロックファイルが変わった場合も全体を再構築する。設定が変わっても以前のファイル接続がグラフに残っていた問題を修正した。
5. 精度向上とキャッシュ再計算のコスト
今回の変更は、リポジトリを移動しても識別子を維持し、言語別の呼び出しの欠落を減らす一方、一部の解析をやり直すコストを伴う。構文解析結果を保存するコード構造と保存形式を定めるASTキャッシュスキーマが40に上がり、既存のキャッシュがあれば影響を受けるSolidity・C#の抽出を再実行する。Pythonの識別子の修正では、キャッシュスキーマの変更は必要ない。
Graphify 0.9.104はパスの移動と言語別の呼び出し追跡の信頼性を高める一方、一部の変更では抽出やグラフ全体の再計算を必要とする。
